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.
Code: Select all
"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!
Code: Select all
"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 #hand
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()]},