10. Das Hinzufügen von neuen NPC mit Tagesabläufen eventuell, an Missionen will ich mal noch gar nicht denken, da das für mich noch weit hinter dem Horizont liegt.
Es entspricht zwar nicht der Reihenfolge der Ideenpunkte, aber da die Sache so gut funktioniert, schreib ich sie gleich mal auf.
In der
shedules.py von Zone 1 (GNO-HQ) habe ich gerade ein nicht aktiviertes Skript des Ausbilders gefunden. In dieser Datei, welche auch in jedem Zonenordner zu finden ist, werden die Tagesabläufe der NPCs definiert.
Ein wenig dran herum gespielt und es zum Laufen gebracht.
"DRILL_INSTRUCTOR" : ( # der Ausbilder
##################
{ #TA1: Tutorial nicht genommen:
S_CONDITION : lambda: data().training_activated and not data().training_done,
"00:00:00" : { #
S_START : [],
S_LOOP : [turn_to_object("ALTER_EGO")]}, .
},{ #TA2: nach dem Tutorial:
"00:30:00" : { # Schlafen
S_START : [goto(460.25, 346.90),
enter_building('BUILDING_1883'),
lay_down_to_sleep('THE FALL_BUILDING_3965')],
S_LOOP : [sleep()]},
"04:30:00" : { # Warten
S_START : [leave_building('BUILDING_1883'),
goto(320.8,326.6),
turn_to_direction(global_defines.DIR_EAST)],
S_LOOP : []},
"21:00:00" : { # Trainigsparcours laufen
S_START : [],
S_LOOP : [patrol(((297.0,353.0),(309.0,343.0),(309.0,293.0),(292.0,293.0)))]},
"00:00:00" : { # Warten
S_START : [goto(320.8,326.6),
turn_to_direction(global_defines.DIR_EAST)],
S_LOOP : []}
}),
Bisher stand er auch nach dem Training blöd in der Sonne oder halt unter dem Mond. Jetzt gönnt er sich mal einen kleinen Lauf und geht schlafen. Mal schauen ob man ihn zum Essen bewegen kann
.
Es funktioniert - ab 4:30 Uhr
ESSEN FASSEN! "DRILL_INSTRUCTOR" : ( # der Ausbilder
##################
{ #TA1: Tutorial nicht genommen:
S_CONDITION : lambda: data().training_activated and not data().training_done,
"00:00:00" : { #
S_START : [],
S_LOOP : [turn_to_object("ALTER_EGO")]},
},{ #TA2: nach dem Tutorial:
"00:30:00" : { # Schlafen
S_START : [goto(460.25, 346.90),
enter_building('BUILDING_1883'),
lay_down_to_sleep('THE FALL_BUILDING_3965')],
S_LOOP : [sleep()]},
"04:30:00" : { # Essen und Trinken
S_START : [leave_building('BUILDING_1883'),
goto_dummy("BUILDING_867","dmyp_001"), sit_down_on_bench()],
S_LOOP : sit_eat_drink_on_bench},
"06:30:00" : { # Warten
S_START : [goto(320.8,326.6),
turn_to_direction(global_defines.DIR_EAST)],
S_LOOP : []},
"21:00:00" : { # Trainigsparcours laufen
S_START : [],
S_LOOP : [patrol(((297.0,353.0),(309.0,343.0),(309.0,293.0),(292.0,293.0)))]},
"00:00:00" : { # Warten
S_START : [goto(320.8,326.6),
turn_to_direction(global_defines.DIR_EAST)],
S_LOOP : []}
}),
Jede Tätigkeit hat so ihre eigene Schleife, die solange durchläuft, bis das Zeitintervall abgelaufen ist. So steht der Ausbilder 4:30 Uhr auf und läuft zum Feuer, setzt sich auf eine Bank und isst bis 6:30 Uhr. Wow, wenn man bedenkt wie viele NPCs einen Tagesablauf haben, ist das schon eine Leistung. Ist ein wenig wie im Film, "...laufe dahin, mache das...."
Bei Gelegenheit werde ich hier in dem Beitrag mehr von solchen
Aktivitätsschleifen auflisten, dann kann man nach dem Baukastenprinzip die Wastelands mit NPCs beleben
Alle Uhrzeiten, Koordinaten, (Namen und Dialoge) und Objekt IDs sind Beispiele und können durch andere ersetzt werden."22:00:00" : { #
auf Bank sitzen, Gitarre spielen S_START : [goto_dummy("BUILDING_2145","dmyp_002"),
Jede Bank hat 3 Plätze (vor der Bank stehend von links nach rechts) dmyp_001, dmyp_002, dmyp_003! play_guitar_on_bench()],
S_LOOP : [play_guitar_on_bench()]},
"22:30:00" : { #
auf Bank sitzen, Flöte spielen S_DIALOG : "NPC_JON_T_006",
S_START : [goto_dummy("BUILDING_866","dmyp_003"),
Jede Bank hat 3 Plätze (vor der Bank stehend von links nach rechts) dmyp_001, dmyp_002, dmyp_003! sit_down_on_bench()],
S_LOOP : [play_fluit_on_bench()]},
"06:30:00" : { #
auf Bank sitzen, Buch lesen S_START : [goto_dummy("BUILDING_866","dmyp_003"),
Jede Bank hat 3 Plätze (vor der Bank stehend von links nach rechts) dmyp_001, dmyp_002, dmyp_003! sit_down_on_bench()],
S_LOOP : [read_book_on_bench()]},
"21:30:00" : { #
Holz hacken S_START : [goto_dummy("BUILDING_2108","dmyp_001"), start_chop_wood()],
S_LOOP : [chop_wood()]},
"15:00:00" : { #
Schippen S_START : [goto_dummy("BUILDING_1788","dmyp_001"), start_shovel_sand()],
S_LOOP : [shovel_sand()]},
"06:00:00" : { #
Loch graben S_START : [goto_dummy("BUILDING_1788","dmyp_001"), start_dig_hole()],
S_LOOP : [dig_hole()]},
"06:00:00" : { #
Muskelaufbautraining S_START : [goto(503.9,442.9),
turn_to_direction(global_defines.DIR_WEST),
make_push_up()],
S_LOOP : [make_push_up()]},
"12:00:00" : { #
ueber Kasten buecken S_START : [goto_object('BUILDING_5906'),
turn_to_object('BUILDING_5906')],
S_LOOP : [lambda char: character.play_animation(char, 'CM_KNIEND_GESTE_AMBIENT_WAFFENLOS')]},
"11:30:00" : { #
Feuer sitzen, Braten S_DIALOG : "NPC_MASON_T_003",
S_START : [goto_dummy("BUILDING_868","dmyp_005"),
Jedes mittlere Lagerfeuer hat mind. 9 Plätze, wenn nicht mehr dmyp_001, ... dmyp_009! sit_down_to_cook()],
S_LOOP : [cook()]},
"19:00:00" : { #
Feuer sitzen, Essen S_START : [goto_dummy("BUILDING_868","dmyp_005"),
Jedes mittlere Lagerfeuer hat mind. 9 Plätze, wenn nicht mehr dmyp_001, ... dmyp_009! sit_down_on_ground()],
S_LOOP : [sit_on_ground(actions = ['eat', 'drink'])]},
"21:00:00" : { #
an dem Ort tanzen S_START : [goto(489.34, 383.82),
turn_to_direction(data().DIR_SOUTH_EAST)],
S_LOOP : [dance()]},
Und Ich jetzt - Kino gehen
"15:00:00" : { #
Patrouille S_START : [],
S_LOOP : [patrol(((313.0,456.0),(252.0,458.0),(248.0,391.0),(309.0,389.0),(312.0,436.0),(311.0,437.0)))]}
"08:00:00" : { #
Bewachen S_START : [goto(311.0,437.0), turn_to_direction(global_defines.DIR_EAST)],
S_LOOP : []},
"23:15:00" : { #
in der Pampa sitzen S_START : [goto((432.83, 502.11)),
turn_to_direction(data().DIR_NORTH),
sit_down_on_ground()],
S_LOOP : [sit_on_ground()]},
"11:30:000" : { #
Sandkasten spielen S_DIALOG : "NPC_KIKI_T_003",
Im Kiki-Tagesablauf gibt es 4 mal das Sandkastenspiel als Schleife, die sich nur durch die Dialoge unterscheiden! S_START : [stepto(514.01, 385.94),
Der Sandkasten kann wegen des Kollisionsmodells sonst nicht begannen werden, also "stepto"-Befehl. turn_to_direction(data().DIR_WEST),
sit_down_on_ground()],
S_LOOP : [sit_on_ground()]},
"15:00:00" : { #
Gwehrschießen S_START : [goto(523.65,560.64), turn_to_direction(45),
start_hunt()],
S_LOOP : [hunt()]},
Das nächste Zeitintervall sollte mit dem Befehl [end_hunt()] beginnen, da sonst die Waffe noch in der Hand ist. "04:00:00" : { #
Schießen beendet + am Ort stehen S_START : [end_hunt()] + [goto(443.9,284.5)],
S_LOOP : [stand()]},
"19:30:00" : { #
Waffe reinigen S_DIALOG : "NPC_FRANK_T_005",
S_START : [goto(459.9,266.7), turn_to_direction(global_defines.DIR_SOUTH_EAST),
start_clean_weapon(),
lambda c: checked_weapon_equip(c)],
S_LOOP : [clean_weapon()]},
"06:30:00" : { #
Waffen reinigen S_DIALOG : "NPC_FAITH_T_002",
Viele NPCs haben in den einzelnen Tätigkeitsintervallen unterschiedliche Dialoge, wenn sie angesprochen werden!
Ich habe diese in den Beispielen meist rausgenommen, aber das wäre die Stelle. S_START : [goto(490.15, 406.16),
turn_to_direction(data().DIR_NORTH),
start_clean_weapon()],
S_LOOP : [clean_weapon()]},