
Das MMORPG Final Fantasy XIV ist für seine umfangreiche Story bekannt, die mit jeder Erweiterung fortgesetzt wird. Eine Spielerin hat sich vorgenommen, sie aufzuschreiben.
Was ist das für ein Unterfangen? Reddit-Nutzerin Eriyu teilte im Subreddit zu Final Fantasy XIV, dass sie an einem vollständigen Skript des Spiels arbeitet. Solche Mitschriften von JRPGs zu PS1-Zeiten hätten “ihr Leben gerettet” und sie sei überrascht gewesen, dass es bislang noch nichts dergleichen für Final Fantasy XIV gebe.
Also habe sie die Sache in ihre eigenen Hände genommen, so Eriyu.
Um den Nicht-Eingeweihten unter euch ein Gefühl dafür zu geben, wie massiv dieses Unterfangen ist: Final Fantasy ist umfangreich genug, um Spieler hunderte (und tausende) Stunden zu beschäftigen. Allein die Cutscenes der Haupthandlung haben laut Reddit-Nutzer Cyberfunk3 eine Gesamtlänge von mehr als 100 Stunden (via Reddit).
Und genau da liegt das Problem: Denn obwohl sich die Cutscenes im Buch Die Unendliche Reise ansehen lassen, ist es nicht so einfach, zu bestimmten Textstellen oder Szenen zu navigieren. Da kommt Eriyu ins Spiel.
window.didomiOnReady = window.didomiOnReady || [];
window.didomiOnReady.push( ( Didomi ) => {
( () => {
const consent = {
ga: ( typeof Didomi === ‚object‘
&& ( Didomi.getLegitimateInterestStatusForVendor( ‚google‘ )
|| Didomi.getUserConsentStatusForVendor( ‚google‘ ) ) ),
io: ( typeof Didomi === ‚object‘
&& ( Didomi.getLegitimateInterestStatusForVendor( ‚c:iotechnol-qyZLPC2H‘ )
|| Didomi.getUserConsentStatusForVendor( ‚c:iotechnol-qyZLPC2H‘ ) ) ),
};
const videoImpressions = {
ga: false,
io: false,
};
const eventLabel = ‚ankuendigung-final-fantasy-xiv-fanfestival-2023-2024,958274‘;
const gaData = {
‚dimension10‘: ‚https://mein-mmo.de/?post_type=mmo_videos&p=958274‘,
‚dimension11‘: ‚Privat: Ankündigung Final Fantasy XIV Fan-Festival 2023-2024‘,
‚dimension12‘: ‚958274‘,
‚dimension13‘: ‚Final Fantasy XIV,23465,game‘,
‚dimension14‘: ‚articledetail-incontent‘,
‚dimension15‘: ‚play‘,
‚metric1‘: ‚0‘,
}
;
const dmConfig = {
player: ‚x86zr‘,
params: {
mute: true,
},
referrerPolicy: ’no-referrer-when-downgrade‘,
}
;
const dmVideo = ‚x8ixlgx‘;
const videoType = ‚inline‘;
const videoAutoplay = false && ( ( localStorage.getItem( ‚mmoVideo_autoplay‘ ) ?? ‚true‘ ) === ‚true‘
|| parseInt( localStorage.getItem( ‚mmoVideo_ap_utime‘ ) || 0 ) + 1000 * 60 * 60 * 24 * 7 {
document.querySelector( ‚.player-wrapper[data-id=“dmp_3″]‘ ).dataset.loading = 1;
if ( typeof jad === ‚object‘ && ‚public‘ in jad ) {
dmplayerLoad();
[ ‚preroll‘ ].forEach( position => {
jad.public.setTargetingOnPosition( position, {
videop: ‚contentplayer‘,
autoplay: ( videoType === ‚header‘ || videoAutoplay ? ‚yes‘ : ’no‘ ),
} );
} );
jad.cmd.push( () => {
const preroll = ‚preroll/dmp_3‘;
jad.public.getDailymotionAdsParamsForScript( [ preroll ], res => {
dailymotion.getPlayer( ‚dmp_3‘ ).then( player => {
player.setCustomConfig( { customParams: res[preroll] + ‚&vpos=preroll‘ } );
player.loadContent( {
video: dmVideo,
} );
} );
} );
} );
} else {
dmConfig.video = dmVideo;
dmConfig.params.customConfig = { customParams: ‚premium‘ };
dmplayerLoad();
}
};
const dmplayerLoad = () => {
dailymotion
.createPlayer( ‚dmp_3‘, dmConfig )
.then( player => {
dmplayerTracking( player );
} )
.catch( err => {} );
};
const dmplayerTracking = player => {
player.on( dailymotion.events.AD_START, event => {
document.querySelector( ‚.player-wrapper[data-id=“dmp_3″]‘ ).dataset.loaded = 1;
} );
player.on( dailymotion.events.PLAYER_START, event => {
document.querySelector( ‚.player-wrapper[data-id=“dmp_3″]‘ ).dataset.loaded = 1;
// cinema button
// not compatible with the dailymotion player
} );
player.on( dailymotion.events.VIDEO_START, event => {
if ( WordPressPopularPosts && wpp_params ) {
const searchParams = new URLSearchParams( {
_wpnonce: wpp_params.token,
wpp_id: 958274,
sampling: wpp_params.sampling_active,
sampling_rate: wpp_params.sampling_rate,
} );
WordPressPopularPosts.post(
wpp_params.ajax_url,
searchParams.toString(),
response => {
wpp_params.debug
&& window.console
&& window.console.log
&& window.console.log( JSON.parse( response ) );
}
);
}
} );
player.on( dailymotion.events.VIDEO_PLAY, event => {
dailymotion
.getAllPlayers()
.forEach( player => {
player
.then( player => {
if ( player.getRootNode().id !== event.id ) {
player.pause();
}
} )
.catch( err => {} );
} );
if ( document.hidden ) {
player.pause();
}
} );
player.on( dailymotion.events.VIDEO_END, event => {
document.querySelector( ‚.player-wrapper[data-id=“dmp_3″]‘ ).dataset.completed = 1;
} );
if ( consent.ga ) {
player.on( dailymotion.events.AD_START, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚adBreakStart‘, eventLabel, gaData );
} );
player.on( dailymotion.events.AD_END, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚adComplete‘, eventLabel, gaData );
} );
player.on( dailymotion.events.AD_ERROR, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚adError‘, eventLabel, gaData );
} );
player.on( dailymotion.events.AD_PLAY, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚adPlay‘, eventLabel, gaData );
dailymotion
.getAllPlayers()
.forEach( player => {
player
.then( player => {
if ( player._privates.id !== event.id ) {
player.pause();
}
} )
.catch( err => {} );
} );
} );
player.on( dailymotion.events.VIDEO_BUFFERING, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚buffer‘, eventLabel, gaData );
} );
player.on( dailymotion.events.VIDEO_END, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚complete‘, eventLabel, gaData );
} );
player.on( dailymotion.events.PLAYER_START, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚view‘, eventLabel, gaData );
} );
player.on( dailymotion.events.PLAYER_ERROR, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚error‘, eventLabel, gaData );
} );
player.on( dailymotion.events.VIDEO_START, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚AllPlays‘, eventLabel, gaData );
if ( videoType === ‚header‘ ) {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚DirectPlays‘, eventLabel, gaData );
} else if ( videoAutoplay ) {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚AutoPlays‘, eventLabel, gaData );
} else {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚ManualPlays‘, eventLabel, gaData );
}
} );
player.on( dailymotion.events.PLAYER_PRESENTATIONMODECHANGE, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚fullscreen‘, eventLabel, gaData );
} );
player.on( dailymotion.events.VIDEO_QUALITYCHANGE, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚levelsChanged‘, eventLabel, gaData );
} );
player.on( dailymotion.events.VIDEO_PLAY, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚play‘, eventLabel, gaData );
} );
player.on( dailymotion.events.VIDEO_PAUSE, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚pause‘, eventLabel, gaData );
} );
player.on( dailymotion.events.VIDEO_SEEKSTART, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ’seek‘, eventLabel, gaData );
} );
player.on( dailymotion.events.PLAYER_VIEWABILITYCHANGE, event => {
if ( event.playerIsViewable && ! videoImpressions.ga ) {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚Impression‘, eventLabel, gaData );
ga( ’send‘, ‚event‘, ‚video-player‘, ‚ImpressionPlayer‘, eventLabel, gaData );
videoImpressions.ga = true;
}
} );
player.on( dailymotion.events.PLAYER_VOLUMECHANGE, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚volume‘, eventLabel, gaData );
} );
// tracking of related videos
document.querySelectorAll( ‚.player-wrapper .related-wrapper .video‘ ).forEach(video => {
video.addEventListener( ‚click‘, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚related-overlay‘, eventLabel, gaData );
} );
} );
document.querySelectorAll( ‚.player-extension.related-wrapper .video‘ ).forEach(video => {
video.addEventListener( ‚click‘, event => {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚related-extension‘, eventLabel, gaData );
} );
} );
}
if ( consent.io ) {
const ioData = {
domain: window.location.hostname,
url: window.location.pathname,
type: ‚Dailymotion‘,
title: encodeURIComponent( ‚Privat: Ankündigung Final Fantasy XIV Fan-Festival 2023-2024‘ ),
reference_time: 107,
video_id: 958274,
image: ‚https://images.mein-mmo.de/medien/2023/03/Thumbnail-Final-Fantasy-Festival-2023-24-780×438.jpg‘,
}
const ioDataString = Object.keys( ioData ).map( key => { return `${key}:${ioData[key]}`; } ).join( ‚,‘ );
let videoTimeUpdate = 0;
const sendDataToIO = metric => {
fetch( `https://tt.onthe.io/?k[]=44218:${metric}[${ioDataString}]` );
};
player.on( dailymotion.events.PLAYER_VIEWABILITYCHANGE, event => {
if ( event.playerIsViewable && ! videoImpressions.io ) {
sendDataToIO( ‚video_view‘ );
videoImpressions.io = true;
}
} );
player.on( dailymotion.events.VIDEO_END, event => {
sendDataToIO( ‚video_watch_finished‘ );
} );
player.on( dailymotion.events.VIDEO_START, event => {
sendDataToIO( ‚video_started‘ );
} );
player.on( dailymotion.events.VIDEO_TIMECHANGE, event => {
// firing every 5 seconds
if ( event.videoTime >= videoTimeUpdate + 5 ) {
sendDataToIO( ‚video_time‘ );
videoTimeUpdate = event.videoTime;
}
} );
}
};
if ( videoType === ‚header‘ ) {
dmplayerInit();
} else if ( videoAutoplay ) {
new IntersectionObserver(
( entries, observer ) => {
entries
.filter( entry => entry.isIntersecting )
.forEach( entry => {
observer.unobserve( entry.target );
dmplayerInit();
} );
}, {
rootMargin: ‚400px‘,
threshold: 0
}
).observe( document.querySelector( ‚.player-wrapper[data-id=“dmp_3″]‘ ) );
} else {
document.querySelector( ‚.player-wrapper[data-id=“dmp_3″]‘ ).addEventListener( ‚click‘, event => {
dmplayerInit();
if ( consent.ga ) {
ga( ’send‘, ‚event‘, ‚video-player‘, ‚Impression‘, eventLabel, gaData );
ga( ’send‘, ‚event‘, ‚video-player‘, ‚ImpressionPoster‘, eventLabel, gaData );
videoImpressions.ga = true;
}
}, { once: true } );
}
} )();
} );
Fast 300.000 Wörter sind erst der Anfang
Was genau beinhaltet das Skript? Bislang hat Eriyu die Haupthandlung von A Realm Reborn und die “Crystal Tower”-Raids niedergeschrieben. Im Moment arbeitet sie an der Erweiterung Heavensward. Der Text beinhaltet alle Cutscenes der Mainquests.
Die Spielerin kündigte bereits an, auch optionale Dialoge, Sidequests und entfernte Inhalte einzufügen, sofern sie irgendwann den aktuellen Stand der Haupthandlung erreichen sollte.
Bereits jetzt umfasst das Dokument fast 300.000 Wörter. Da die Website, auf der Eriyu ihr Skript hostet, bei einigen Reddit-Nutzern für eine Sicherheitswarnung sorgte, verzichten wir an dieser Stelle auf eine direkte Verlinkung und verweisen stattdessen auf den Reddit-Post.
Eriyu scheint aber bereits nach anderen Möglichkeiten zu suchen, ihr Werk zu hosten.
Wie macht Eriyu das? Indem sie das komplette Spiel auf einem alternativen Account spielt und dabei mitschreibt. Einen großen Teil des Textes könne sie zwar aus dem Events-Tab der Chatbox kopieren, den zu formatieren sei aber immer noch viel Arbeit.
Zwar würden andere 3rd-Party-Dienste ebenfalls Quest-Dialoge zum Nachlesen anbieten, Eriyu erklärt allerdings, dass dort manche Szenen fehlen würden und sich einige Fehler eingeschlichen hätten. Sie würde daher “99 % des Textes” direkt aus dem Spiel beziehen.
Warum das Ganze? Hauptsächlich wohl einfach aus Liebe zum Spiel. Praktisch lässt sich das Skript mit der Tastenkombination Strg+F durchsuchen, um etwa den genauen Wortlaut einer Cutscene zu erfahren, bestimmte Story-Momente nachzulesen oder einfach, um herauszufinden, wie oft von Seelen die Rede ist (130-mal bis jetzt!).


Die Arbeit und Mühe, die Gamer in Projekte zu ihren Lieblingsspielen stecken, ist immer wieder beeindruckend. Ein Fan des Loot-Shooters Destiny 2 nahm es einfach selbst auf sich, eine eigene Serie zu produzieren und sammelte dafür fast 56.000 Euro via Crowdfunding.
Destiny 2: Erstes TV-Serien-Projekt „Ace“ begeistert weltweit – MeinMMO sprach mit dem Entwickler
Der Beitrag FF XIV: Gamerin schreibt die gesamte Handlung des MMORPGs auf, damit ihr nie wieder falsch zitieren müsst erschien zuerst auf Mein-MMO.de.
Source: Destiny 2 PC