Mod-Tagebuch
Moderators: Newsposter, Global Moderator, Zugriff Intern, Moderator
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Mod-Tagebuch
da ich nun "The Fall" fast zu Ende gespielt habe, sind mir für das Spiel so ein paar Ideen gekommen. Diese würde ich gern auf den einzelnen Karten umsetzten.
Da ich aber schon genau so oft geskriptet habe wie Agnes vielleicht Fleisch gegessen hat, bin ich gespannt ob es was wird.
Für das Spiel gibt es einen Editor und ein beiliegendes Mod-Tutorial, welche die Entwickler der Reloaded Version (1.10.1) gesponsert haben.
Sicher ist der Editor etwas gewöhnungsbedürftig und das Tutorial erscheint mir auch etwas kryptisch, da sich einige Sachen von den im Spiel verwendeten Skripten unterscheiden.
Dennoch sind ein paar hübsche Sachen möglich. Recht herzlichen Dank an Lexx für seine Infos an dieser Stelle, er hat ja schon Mods und seine Demo-Map für "The Fall" hier vorgestellt, welche mir zum Verständnis der Skripte geholfen haben.
In diesem Thread würde ich gern alle gemachten Erkenntnisse sammeln. Wer also Lust und Muße hat, kann gern seine Mod-Erfahrungen hier hineinschreiben.
Alles beginnt immer mit einer Vorstellung oder Idee von etwas... und diese ist die bestehenden Karten ein wenig zu verändern.
Bei "The Fall" waren das folgende:
1. Im Laufe des Spiels ist eine Sammlernatur mehr mit Itemmanagement beschäftigt, als mit Spielen. Trotz aller Kofferräume der 5 Autos fing man an auch noch irgendwelche kleinen Sammelecken anzulegen . Inventar vergrößern ?
2. Die Werte der Items, wie z.B. die 2 kg schwere Glühbirne oder die angefertigten Halsketten, welche meist billiger waren als die Ausgangsmaterialien, etwas realistischer zu verändern. Das selbe Spiel bei den Waffen. Werte verändern?
3. Die versiegenden Wasserquellen hätten ruhig etwas mehr Wasserportionen haben können. Auch ein paar mehr Quellen hinzufügen, z. B. in ausgetrockneten Seen, Flüssen ?
4. Den gesamten Tierbestand etwas mehr aufpeppen, in New Safford kann man sich der Kühe als Nahrungsquelle noch bedienen, bei fast allen anderen funktioniert das nicht mehr, abgesehen von den Kamikazeminenkühen in Bowie Village.
5. Die Bonuspunkte für das Erlegen von Gegnern war mir auch schleierhaft, für einen "Bergtiger", der ja eigentlich ein Puma (Berglöwe) ist gibt`s 3 Punkte für einen Bären 0,5.
6. Ein wenig mehr Benzin im Spiel wäre nett und Bienenwachs in den Stöcken.
7. Da und dort könnte man auch noch ein wenig Items in die Kisten stopfen oder die Arztpraxis mit Medikamenten ausstatten, wie z. B. die verlassene medizinische Station in Copper Hill.
8. Das Platzieren eines Autos an eine bestimmte Stelle wäre auch nicht schlecht oder ein Seekercamp. Warum sollen die Typen nur immer die Rastenden angreifen, einfach mal den Spieß umdrehen.
9. Die Bereicherung der Karten mit einzelnen Objekten wäre sicher auch ganz nett.
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.
Mal schauen was draus wird und wann mich das Moddingfieber verlässt .
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
Re: Mod-Tagebuch
Wage zu bezweifeln, dass das möglich ist.1. Im Laufe des Spiels ist eine Sammlernatur mehr mit Itemmanagement beschäftigt, als mit Spielen. Trotz aller Kofferräume der 5 Autos fing man an auch noch irendwelche kleinen Sammelecken anzulegen Smiley. Inventar vergrößern ?
Beides sollte sehr einfach zu bewerkstelligen sein. Die Item-Attribute befinden sich alle in den entsprechenden Python-Scripten. Die Wasserquellen werden - afaik - in den jeweiligen Zonen-Scripte behandelt. Ich bin mir gerade nicht sicher, ob die Wassermenge eingestellt werden kann, es ist aber kein Problem, weitere Quellen hinzuzufügen.2. Die Werte der Items, wie z.B. die 2 kg schwere Glühbirne oder die angefertigten Halsketten, welche meist billiger waren als die Ausgangsmaterialien. Das selbe Spiel bei den Waffen. Werte verändern?
3. Die versiegenden Wasserquellen hätten ruhig etwas mehr Wasserportionen haben können. Auch ein paar mehr Quellen hinzufügen, z. B. in ausgetrockneten Seen, Flüssen ?
Das Problem hier ist imo, dass beides nicht respawnt. Kein Händler ändert übers Spiel das Warenangebot. Das sollte angepasst werden.6. Ein wenig mehr Benzin im Spiel wäre nett und Bienenwachs in den Stöcken.
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Software
Ein Packprogramm (z.B.: 7.zip) ist notwendig, um die komprimierten Dateien im The Fall-Ordner zu entpacken. Alle Karten befinden sich in zones.ubn, die Skripte in scripts.ubn.
Jede Karte ist einer Zone gleichgestellt, z.B. das GNO-HQ entspricht Zone1. In jedem Zonenordner befinden sich wiederum eine Anzahl von Python-Dateien (npc.py, zone_1.py, const.py....) und eine Zip-Datei.
Letztere beinhaltet die Karte, welche im Map-Editor geladen werden kann.
Besagter Map-Editor ist ja schon dabei und kann über das Startmenü des Spiels geöffnet werden. Dann kann man unter FILE / OPEN die einzelnen Zonen-Ordner anwählen und da die Zip-Datei laden - je nach Rechner kann das schon etwas dauern.
Wenn nun die Karte geladen wurde mit STrg+A oder unter VIEW / FREE CAMERA die Kameraperspektive deutlich verbessern - dann wie gewohnt navigieren.
Am linken Rand finden sich z.B. viele aufgelistete Objekt, welche man platzieren kann, z.B. OBJEKTE / PLAKATE UND SCHILDER / Stopschild. Unter VIEW / SHOW OBJEKT INFO kann man sich die Koordinaten oder die ID des Objekts ansehen. Dies ist echt wichtig für das Skripten dann.
Die Python-Skripte waren mir erst ein vollkommenes Rätsel - diese kann man mit dem Texteditor öffnen und man wird von eine Zeilenflut erschlagen. Hmm, habe dann einen Python-Skripteditor namens Wing IDE 101 3.2 gefunden und mit jenem sehen die PY-Dateien schon wesentlicher benutzerfreundlich, aber immer noch rätselhaft aus (ist halt mein erster Kontakt mit Python).
Die im Weiteren geschilderten Erfahrungen stammen nun aus diesen Skripten - der Map-Editor kann zum visuellen Verständnis und als Koordinatenquelle dienen.
Die veränderten Skripte werden nur bei bei einem Neustart des Spiels wirksam, also frühere Savegames funktionieren nicht. (Danke Lexx)
Damit komme ich auch schon zum ersten großen Problem - die Startkarte ist das GNO-HQ (Zone1). Diese zu verändern macht Spaß, aber was ist, wenn man die Schattenbasis (Zone8) modifizieren möchte. Muß man dann alle Karten bis dahin spielen bevor man seine winzige Skriptänderung kontrollieren kann - was für ein Albtraum.
Man muss es nicht. Nach schon fast genervten Durchstöbern der Skripte ist mir im Ordner scripts die "global_defines.py" aufgefallen und da am Anfang steht eine wichtige Zeile:
Code: Select all
# which zone to load on campaign start
ENTRY_ZONE = "zones\\zone_1\\zone_1"
Wenn man nun z.B. die zone_1 durch zone_8 ersetzt:
Code: Select all
# which zone to load on campaign start
ENTRY_ZONE = "zones\\zone_8\\zone_8
beginnt jedes neu gestartete Spiel z.B. in der Schattenbasis. Der Charakter ist dann zwar ziemlich mittellos in Unterwäsche, aber zum Testen reicht es.
Erstes Problem gelöst
Die zweite Alternative ist mit dem Konsolenbefehl (F11) import debug; debug.cheat("map") alle Karten frei zu schalten.
Falls man mal eine Datei versaut, die Orginaldateien sind ja immer noch in den gepackten UBN-Dateien enthalten.
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Inventarvergrößerung und Werte der Items ändern
Wie könnte man diese Idee verwirklichen?1. Im Laufe des Spiels ist eine Sammlernatur mehr mit Itemmanagement beschäftigt, als mit Spielen. Trotz aller Kofferräume der 5 Autos fing man an auch noch irgendwelche kleinen Sammelecken anzulegen . Inventar vergrößern ?
Option A
Man fügt einfach noch ein Fahrzeug in das Spiel ein, am besten den Radpanzer, der hat den größten Kofferraum (48 Slots), der Humvee und Pickups einen mittleren (35 Slots) und der Buggy (24), den kleinsten.
Siehe weiter unten im Thread.
Option B
Man erweitert die Slotanzahl aller Fahrzeuge ebenfalls auf 48 Slots. Unter scripts / itemdata / vehicles.py findet am die Eigenschaften der Fahrzeuge:
Code: Select all
create_vehicle_type(typeid='SET_BUGGY')
objects.set_attribute(object='SET_BUGGY', attribute="name", value=globaltext.SET_BUGGY_NAME)
.
.
.
objects.set_attribute(object='SET_BUGGY', attribute="inventory_slots", value=24)
Option C
In der Geschichte der ganzen Patchorgie dieses Spiels habe ich gelesen, dass das Stapeln von Objekten (Munition, Nahrungsmittel, Medipacks) nicht so richtig möglich war. Ab irgendeiner Patchversion hatten die Entwickler aber eine "Stapelbarkeit" eingebaut.
In der Datei scripts / itemdata / items.py stehen die Eigenschaften der Gegenstände:
Code: Select all
create_item_type(typeid='SET_NORMAL_CLOTHES_1')
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="name", value=globaltext.SET_NORMAL_CLOTHES_1_NAME)
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="hint", value=globaltext.SET_NORMAL_CLOTHES_1_HINT)
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="resourceui", value='RES_ITEM65X32_MISCITEM_NORMAL_CLOTHES_1')
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="resource3d", value='RES3D_NORMAL_CLOTHES_1')
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="value", value=5.00)
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="weight", value=2.50)
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="stacking", value=1)
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="armor", value=1)
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="occupied_slots", value=["clothes"])
Habe den Wert von 1 auf 2 erhöht und es funktioniert wunderbar.
objects.set_attribute(object='SET_NORMAL_CLOTHES_1', attribute="stacking", value=2)
Nach diesem Prinzip können so wesentlich mehr Objekte aufgenommen werden, bei Munition - warum den nur 10, vielleicht 50 oder 100 Packungen.
Das Gute ist, der limitierende Faktor im Inventar der Personen ist nun das Gewicht und nicht mehr die Slotanzahl. Bei den Kofferräumen der Fahrzeuge ist das Gewicht ja egal, also nie wieder mehrerer Munitionsstapel im Auto verbrauchen, sondern nur einen Slot besetzen.
Funktioniert nach ähnlichem Prinzip wie oben beschrieben, ein Wert wird verändert.2. Die Werte der Items, wie z.B. die 2 kg schwere Glühbirne oder die angefertigten Halsketten, welche meist billiger waren als die Ausgangsmaterialien. Das selbe Spiel bei den Waffen. Werte verändern?
Wir nehmen mein Lieblingsbeispiel - das VERY_NICE_BRACELET (Sehr schöne Armband), zu finden in der Datei scripts / itemdata / items.py
Code: Select all
create_item_type(typeid='SET_VERY_NICE_BRACELET')
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="name", value=globaltext.SET_VERY_NICE_BRACELET_NAME)
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="hint", value=globaltext.SET_VERY_NICE_BRACELET_HINT)
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="resourceui", value='RES_ITEM65X32_MISCITEM_VERY_NICE_BRACELET')
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="resource3d", value='RES3D_VERY_NICE_BRACELET')
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="value", value=8.0)
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="weight", value=0.4)
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="stacking", value=1)
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="combine_xp", value=75)
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="item_combination", value={
"difficulty_assemble" : 75,
"combination_list" : [['SET_SHORT_LEATHER_STRING', 'SET_BEAR_CLAW', 'SET_BEAR_TEETH'],
['SET_SHORT_LEATHER_STRING', 'SET_TIGER_CLAW', 'SET_TIGER_TEETH'],
['SET_SHORT_LEATHER_STRING', 'SET_WOLF_CLAW', 'SET_WOLF_TEETH'],
['SET_SHORT_LEATHER_STRING', 'SET_HYENA_CLAW', 'SET_HYENA_TEETH'],
['SET_SHORT_LEATHER_STRING', 'SET_WILD_DOG_CLAW', 'SET_WILD_DOG_TEETH']]})
Also ich bin für mindestens 12.
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="value", value=12.0)
und nur nochmal zur Übung, in den Slot passen doch mehr Armbänder rein
objects.set_attribute(object='SET_VERY_NICE_BRACELET', attribute="stacking", value=50)
Die Werte für die Waffen stehen in der Datei scripts / itemdata / weapons.py.
Der Phantasie sind dann wieder keine Grenzen gesetzt, `ne Anaconda mit ordentlich Durchschlag oder die Reichweite der Armbrust erhöhen
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Wasserquellen editieren
Die auf fast jeder Karte (Zone) zu findenden Wasserquellen sind im Zonenordner X in der Datei zone_X.py verankert. Das wäre z.B. für das GNO-HQ (Zone1): zones / zone_1 / zone_1.py3. Die versiegenden Wasserquellen hätten ruhig etwas mehr Wasserportionen haben können. Auch ein paar mehr Quellen hinzufügen, z. B. in ausgetrockneten Seen, Flüssen?
Fast am Anfang der Datei (Zeile 84 im Wing IDE 101 3.2) steht:
Code: Select all
def initWaterResources():
water.set_water_source(345.3,476.7,4)
#water.set_water_source(258.3,264.6,2)
water.set_water_source(419.5,349.8,3)
Ich habe zum Testen einfach mal # entfernt und festgestellt, das nun eine 3. Quelle nördlich des Übungsgeländes gefunden werden kann, welche 2 l hergibt.
So könnten nun im Skript unter den bestehenden Quellen noch mehr eingefügt werden, wobei die x- und y-Koordinaten aus dem Map-Editor gelesen werden können.
water.set_water_source(x-Koordinate,y-Koordinate, Literzahl der Quelle)
Man kann auch alle bestehenden Quellen einfach mit einem höheren Wasservolumen ausstatten, z.B. aus
water.set_water_source(419.5,349.8,3) wird dann water.set_water_source(419.5,349.8,30)
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
Re: Mod-Tagebuch
Code: Select all
import debug; debug.cheat("pickinfo")
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Nützliche Konsolenbefehle
Ich hatte im Mod-Tutorial davon gelesen, bin aber nicht recht schlau daraus geworden. COOL - Jetzt funzt es .
Bin da auch noch auf eine Reihe von cheats gestoßen, welche man in die Console eingeben kann:
Bei nochmaligen Eingeben werden die cheats wieder ausgeschaltet.
import debug; debug.cheat("teleport") - transportiert den char über das Kontext-Menü (ein T in einem Kreis) zu der Stelle des Mauszeigers - nur Superman reist jetzt schneller
import debug; debug.cheat("map") - schaltet alle Karten frei und man kann überall hinreisen - noch bevor man bei Wesley war
import debug; debug.cheat("mad_skillz") - damit kann man munter in der ID-Card alle Attribute und Fähigkeiten verändern - zum Testen aller Talente ideal
import debug; debug.cheat("endless ammo") - endlos Munition, wer es mag
import debug; debug.cheat("endless gas") - endlos Treibstoff, so kann man dann das Benzinproblem auf unrealistische Weise auch lösen
import debug; debug.cheat("immortal") - der typische "Ich kann nicht sterben Modus"
import debug; debug.cheat("unlock_all") - öfnnet alle verschlossenen Kisten und Safes auf der Karte
import debug; debug.cheat("no_fatigue") - chars werden nicht müde und brauchen nicht rasten
import debug; debug.cheat("no raid") - chars werden nicht mehr überfallen bei der Rast
import debug; debug.cheat("region") - zeigt bestimmte Regionen an, z.B. Trigger
import debug; debug.cheat("tile") - zeigt die Kollisionsmodelle der Objekte an - nützlich
Wer mehr Konsolenbefehle sehen will - einfach import debug; debug.cheat("help") eingeben - dann erscheinen noch mehr
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Spawnbare Tierwelt
4. Den gesamten Tierbestand etwas mehr aufpeppen, in New Safford kann man sich der Kühe als Nahrungsquelle noch bedienen, bei fast allen anderen funktioniert das nicht mehr, abgesehen von den Kamikazeminenkühen in Bowie Village
In jedem Zonenordner gibt es eine Pythondatei namens npc.py. In dieser sind nicht nur alle NPCs definiert sondern auch die Tiere. Mit dem Wing IDE 101 3.2 also z.B. aus Zone 3 (Bowie Village) die npc.py geöffnet und man findet am Anfang:
Code: Select all
system.create_animal(id="KUH_1", type=ANIMAL_COW, party="ANIMALS", x = 256.33, y = 445.68)
objects.set_immortal_state("KUH_1", True)
system.create_animal(id="KUH_2", type=ANIMAL_COW, party="ANIMALS", x = 256.03, y = 432.96)
#objects.set_immortal_state("KUH_2", True)
objects.set_direction('KUH_2', 160)
system.create_animal(id="KUH_3", type=ANIMAL_COW, party="ANIMALS", x = 253.17, y = 439.44)
objects.set_immortal_state("KUH_3", True)
objects.set_direction('KUH_3', 90)
system.create_animal(id="KUH_4", type=ANIMAL_COW, party="ANIMALS", x = 256.69, y = 441.15)
objects.set_immortal_state("KUH_4", True)
system.create_animal(id="KUH_5", type=ANIMAL_COW, party="ANIMALS", x = 264.58, y = 437.24)
objects.set_immortal_state("KUH_5", True)
objects.set_direction('KUH_3', 180)
Dies sind die 5 Kühe in der Farm. Die Zeile objects.set_immortal_state("KUH_1", True) verhindert, das Erlegen der Tiere.
Wenn man davor ein # setzt, können die Tiere sterben. Also im Beipiel ist Kuh 1 unsterblich und Kuh 2 nicht.
Stirbt diese aber, erscheint sie nicht wieder auf der Karte - sie ist definitiv tot, anders bei den nur periodisch auftauchenden Tieren (gespawnte Wölfe z.B. zwischen 22 und 6 Uhr) welche nach einer Weile wieder erscheinen.
Die Unsterblichkeitseigenschaft kann man nutzen, wenn man einfach Tiere zur Dekoration verwenden möchte.
Witzigerweise haben die Entwickler in Bowie Village auch drei Schweine eingebaut, sie aber deaktiviert
Fortsetzung folgt..........jetzt
Unter script / spawnanimals.py finden man am Anfang eine Liste aller Zonen (Karten), in denen die Tiere immer wieder erscheinen.
Code: Select all
SPAWN_ANIMAL_ZONES = ['zone_1.zone_1'
,'zone_2.zone_2'
,'zone_3.zone_3'
,'zone_4.zone_4'
,'zone_5.zone_5'
,'zone_6.zone_6'
,'zone_7.zone_7'
#,'zone_8.zone_8' #Kein Tier
#,'zone_9.zone_9' #Kein Tier, data().SpawnAnimals anders benutzt!
#,'zone_10.zone_10' #Kein Tier
,'zzone_1.zzone_1'
,'zzone_2.zzone_2'
#,'zzone_3.zzone_3'
,'zzone_4.zzone_4'
#,'zzone_5.zzone_5'
#,'zzone_6.zzone_6'
#,'zzone_7.zzone_7'
#,'zzone_8.zzone_8'
,'zzone_9.zzone_9'
#,'zzone_10.zzone_10' # Bunker
#,'sqzone_1.sqzone_1' # kein Tier
,'sqzone_2.sqzone_2'
#,'sqzone_3.sqzone_3'
#,'sqzone_4.sqzone_4'
#,'sqzone_5.sqzone_5'
]
TIME_TO_RETURN_FROM_GRAVE = time("72:00:00")
TIME_TO_RETURN_FROM_GRAVE = time("72:00:00")
Diese Zeile gibt an, dass nach dem ein gespawntes Tier erlegt wurde, es nach 72 Spielstunden wieder an seinem Ort erscheint.
Alle gespawnten Tiere sind dann wieder in den Pythonskripten der einzelnen Zonenordnern definiert.
Im wesentlichen sind das dann drei beteiligte Dateien, die const.py,die npc.py und zone_X.py
In Zone 1(GNO_HQ) der zone_1 / const.py steht dann ziemlich im letzten Drittel:
Code: Select all
def init_data():
.
.
.
### Fuer Spawn-Animals ###
data().Timer_SpawnTimeChecker = 666
data().Timervalue_SpawnTimeChecker = 10 * 60 * 1000.0 * hour_real_to_game
data().SpawnAnimalsSpawned = False
data().SpawnAnimals = ["WOLF_S_LEAD","WOLF_S_1","WOLF_S_2","WOLF_S_3"]
Die Lokation und die Eigenschaften der gespanten Tiere findet man wieder in der zone_1 / npc.py.
Code: Select all
## Initialisiert die Tiere der Zone
def initAnimals():
system.create_animal(id="WOLF_S_LEAD", type=ANIMAL_WOLF, party="ANIMALS", x=291.5, y=572.5, direction=90)
system.create_animal(id="WOLF_S_1", type=ANIMAL_WOLF, party="ANIMALS", x=292.0, y=576.0, direction=60)
system.create_animal(id="WOLF_S_2", type=ANIMAL_WOLF, party="ANIMALS", x=288.5, y=573.0, direction=120)
system.create_animal(id="WOLF_S_3", type=ANIMAL_WOLF, party="ANIMALS", x=287.5, y=576.0, direction=120)
objects.set_attribute('WOLF_S_LEAD', 'level', 1)
objects.set_attribute('WOLF_S_1', 'level', 1)
objects.set_attribute('WOLF_S_2', 'level', 1)
objects.set_attribute('WOLF_S_3', 'level', 1)
Code: Select all
## Spawnanimals sind feindlich und erstmal inactiv
for animal in data().SpawnAnimals:
objects.set_attribute(animal,"foes", ["UISPIELER"])
objects.set_active_state(animal,INACTIVE)
In der zone_1 / zone_1.py findet man das definierte Zeitintervall für den Respawn der 4 Tiere auf der GNO-Karte
Code: Select all
def on_timer(id):
.
.
.
if (id == data().Timer_SpawnTimeChecker):
clock = system.get_mission_time().get_day_time()
if (clock >= time("06:00:00") and clock < time("22:00:00")):
spawnanimals.spawnAnimals(INACTIVE)
else:
spawnanimals.spawnAnimals(ACTIVE)
system.notify_timer(data().Timer_SpawnTimeChecker,data().Timervalue_SpawnTimeChecker)
Ein zweites Beispiel ist das Zeitintervall des Respawns der Tiere auf der Konvoi-Karte, zu finden in der sqzone_2 / sqzone_2.py :
Code: Select all
def on_timer(id):
if (id == data().Timer_SpawnTimeChecker):
clock = system.get_mission_time().get_day_time()
if (clock < time("16:00:00") or clock > time("23:00:00")):
spawnanimals.spawnAnimals(INACTIVE)
else:
spawnanimals.spawnAnimals(ACTIVE)
system.notify_timer(data().Timer_SpawnTimeChecker,data().Timervalue_SpawnTimeChecker)
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Bonuspunkte und Killpoint editieren
Das Bonuswertesystem befindet sich am Ende der Datei scipts / global_difines.py5. Die Bonuspunkte für das Erlegen von Gegnern war mir auch schleierhaft, für einen "Bergtiger", der ja eigentlich ein Puma (Berglöwe) ist gibt`s 3 Punkte für einen Bären 0,5.
Code: Select all
# kill_types for id card stats & weapon accustomisation
kill_type_list = ["DESERT_MONKS", "RAT_SKULLS", "SEEKER","INDIANS","NOMADS", "SHADOWS", "GNO_SOLDIERS", "MISC_NPCS", "UNKNOWN_NPCS",
"WOLF", "BEAR", "WARG", "TIGER", "WILDDOG", "PEACEFUL_ANIMALS", "UNKNOWN_ANIMALS"]
kill_points = {
"DESERT_MONKS": 3,
"RAT_SKULLS": 3,
"SEEKER": 2,
"INDIANS": 2,
"NOMADS": 2,
"SHADOWS": 4,
"GNO_SOLDIERS": 5,
"MISC_NPCS": 1,
"UNKNOWN_NPCS": 3,
"WOLF": 0.2,
"BEAR": 0.5,
"WARG": 4,
"TIGER": 3,
"WILDDOG": 0.1,
"PEACEFUL_ANIMALS": 0,
"UNKNOWN_ANIMALS": 0.2,
}
Nun kann man abschätzen und wählen, ob man die Bärenjagd nicht etwas mehr belohnt, also den Wert z.B. von 0.5 auf 3 erhöht.
Diese "Killpoints" werden gesammelt und je nach der Höhe der "Gesamtkillpoints" werden Bonuspunkte auf alle Fähigkeiten addiert.
Die Skilltabelle findet sich in scripts / skill_tables.py am Ende:
Code: Select all
def get_reputation_bonus_per_killpoints(killpoints):
"""Returns the reputation skill point bonus for the given amount of killpoints.
"""
if killpoints < 25: return 0
elif killpoints < 50: return 1
elif killpoints < 100: return 1
elif killpoints < 150: return 2
elif killpoints < 250: return 2
elif killpoints < 500: return 3
elif killpoints < 1000: return 4
else: return 5
def get_reputation_description(killpoints):
"""Returns the reputation description for the given amount of killpoints.
"""
if killpoints < 25: return globaltext.MISSION_IDCARD_REPUTATION_DESC_0
elif killpoints < 50: return globaltext.MISSION_IDCARD_REPUTATION_DESC_1
elif killpoints < 100: return globaltext.MISSION_IDCARD_REPUTATION_DESC_2
elif killpoints < 150: return globaltext.MISSION_IDCARD_REPUTATION_DESC_3
elif killpoints < 250: return globaltext.MISSION_IDCARD_REPUTATION_DESC_4
elif killpoints < 500: return globaltext.MISSION_IDCARD_REPUTATION_DESC_5
elif killpoints < 1000: return globaltext.MISSION_IDCARD_REPUTATION_DESC_6
else: return globaltext.MISSION_IDCARD_REPUTATION_DESC_7
Code: Select all
"""Returns skill bonus for being accustomed to this weapon/weapon type.
Parameters:
id_kills - Number of kills with this weapon.
type_kills - Number of kills with this weapon_type.
"""
if id_kills <= 9: id_bonus = 0 # Sehr ungewohnte Waffe
elif id_kills <= 29: id_bonus = 5 # Ungewohnte Waffe
elif id_kills <= 59: id_bonus = 10 # Vertraute Waffe
elif id_kills <= 99: id_bonus = 15 # Sehr vertraute Waffe
else: id_bonus = 20 # Lieblingswaffe
if type_kills <= 9: type_bonus = 0
elif type_kills <= 29: type_bonus = 0
elif type_kills <= 59: type_bonus = 5
elif type_kills <= 99: type_bonus = 10
else: type_bonus = 15
return max(id_bonus, type_bonus)
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
NPC-Tagesabläufe modifizieren
Es entspricht zwar nicht der Reihenfolge der Ideenpunkte, aber da die Sache so gut funktioniert, schreib ich sie gleich mal auf.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.
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 : []}
}),
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 : []}
}),
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()]},
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
Re: Mod-Tagebuch
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Platzieren von Items, Bienenwachs und Benzin
Die Atmosphäre wurde um Welten besser - auch das Suchen der Questgeber .
Das Modifizieren von Karten und die Erstellung von Mapmods hat mir ja schon immer viel Freude gemacht - wenn ich da an Vice City oder San Andreas denke - nur sind die Karteneditoren da etwas benutzerfreundlicher . Meistens scheitere ich halt an den Skripten (bin halt keine Programmierleute) und versuche durch viel Probieren meistens nur Werte oder baukastenmäßig Skripte zu verändern. Die meist bestehenden "Communities" der Spiele sind da echt hilfreich - bin da schon echt froh hier die ein oder andere Info zu bekommen .
Zurück zu den Punkten 6 und 7.
In jedem Zonenordner findet man das Zonenpythonskript, für Zone 1 wäre es z.B.: zone_1.py. Darin findet man unter def initItems(): eine Liste der Items, welche unterschiedlich entweder so auf der Karte an den Koordinaten zu finden sind oder im Inventar der NPC, Kisten, Bienenstöcke, des Händlers liegen.6. Ein wenig mehr Benzin im Spiel wäre nett und Bienenwachs in den Stöcken.
7. Da und dort könnte man auch noch ein wenig Items in die Kisten stopfen oder die Arztpraxis mit Medikamenten ausstatten, wie z. B. die verlassene medizinische Station in Copper Hill.
Code: Select all
def initItems():
if not hasattr(data(),"patch_patrick"):
data().patch_patrick = 1
# Fass am Eingang des Dorfes
objects.create_item_in_inventory( object="BUILDING_1716",equipment=["SET_WALTER_PPK"])
# Kieshaufen
objects.create_item_in_inventory( object="BUILDING_1739",equipment=["SET_SMALL_SAND_SHOVEL"])
# Auf dem Sandspielplatz
system.create_object(equipmenttype="SET_AMMOPACK_7_65_MM",x=518,y=381,direction=47)
.
.
.
## TA-NPC Items (Items für NPCs die auch sterben können)
objects.create_item_in_inventory("KATHARINE",["SET_WIRE_WHISK","SET_RAT_MEAT"])
.
.
.
# Händler
objects.create_item_in_inventory("SEBASTIAN",
[
"SET_UZI",#Uzi
"SET_COLT_ANACONDA",#Colt Anaconda
"SET_SPECIAL_38",#38er Special
"SET_BERETTA_92F",#Beretta
# "SET_LANDMINE",#Landmine
"SET_HEGRENADE",#HE granate
"SET_MOLOTOV_COCKTAIL",#Molotov
.
.
.
"SET_PAN",
"SET_SPIT"]
)
# Bienenstöcke Z1
objects.create_item_in_inventory( 'BUILDING_10467', equipment=[ 'SET_BEESWAX', 'SET_BEESWAX' ] )
objects.create_item_in_inventory( 'BUILDING_10464', equipment=[ 'SET_BEESWAX', 'SET_BEESWAX' ] )
objects.create_item_in_inventory( 'BUILDING_10463', equipment=[ 'SET_BEESWAX' ] )
# Items in Kisten
objects.create_item_in_inventory( 'BUILDING_10251', equipment=[ 'SET_DUCT_TAPE', 'SET_GLOCK_21', 'SET_AMMOPACK_44' ] )
objects.create_item_in_inventory( 'BUILDING_10252', equipment=[ 'SET_LEATHER_CLOTHES', 'SET_WATER_SKIN', 'SET_DRUGS_PILLS_01','SET_STEEL_PLATES' ] )
objects.create_item_in_inventory( 'BUILDING_10281', equipment=[ 'SET_THROWING_KNIFE', 'SET_AMMOPACK_44', 'SET_LEATHER_GLOVES' ] )
objects.create_item_in_inventory( 'BUILDING_102
.
.
.
Code: Select all
objects.set_attribute(object='SET_BUGGY', attribute="current_fuelquantity", value=100.0)
objects.set_attribute(object='SET_BUGGY', attribute="max_fuelquantity", value=100.0)
objects.set_attribute(object='SET_BUGGY', attribute="fuel_consumption_factor", value=0.00125)
Die dritte Zeile definiert den Verbrauch, statt 0,00125 einfach auf 0,0005 herunter gehen und der Verbrauch sinkt schon mal deutlich.
Der Test mit 0.05 war auch schön, die Tankanzeige sank bei fast jedem Meter erheblich.
Man kann auch den Benzinverbrauch durch den Fahrerskill beeinflussen. In der scrips / object_events.py findet man:
Code: Select all
if objects.has_attribute( driver, "driving"):
skill = objects.get_attribute( driver, "driving")
if skill > 54:
can_drive = True
fuel_consumption_factor_obj = fuel_consumption_factor_type
if skill > 69:
speedfactor = 0.8
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.9
if skill > 84:
speedfactor = 0.9
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.8
if skill > 94:
speedfactor = 1.0
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.7
if skill > 104:
speedfactor = 1.0
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.6
if skill > 114:
speedfactor = 1.0
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.55
if skill > 124:
speedfactor = 1.0
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.5
if skill > 134:
speedfactor = 1.0
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.47
if skill > 149:
speedfactor = 1.0
fuel_consumption_factor_obj = fuel_consumption_factor_type * 0.45
if has_talent( driver, "driving", "economic_driving"):
fuel_consumption_factor_obj = fuel_consumption_factor_obj * 0.8
objects.set_attribute( vehicle_id, "speed_factor", speedfactor)
objects.set_attribute( vehicle_id, "fuel_consumption_factor", fuel_consumption_factor_obj)
fuel_consumption_factor_obj = fuel_consumption_factor_type (ist bei allen Fahrzeugen 0.00125) * 0.7 = 0.00086
Die Fähigkeit "Ökonomisch Fahren" senkt den Verbrauch nochmals um 20% (Faktor 0.8 ).
Auf diese Weise kann man das Treibstoffproblem dann auch lösen.
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
Re: Mod-Tagebuch
Code: Select all
Test
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Platzieren von Fahrzeugen
Für das Platzieren eines Humvees nehmen wir wieder als Beispiel die Karte des GNO-HQs (Zone1).8. Das Platzieren eines Autos an eine bestimmte Stelle wäre auch nicht schlecht oder ein Seekercamp. Warum sollen die Typen nur immer die Rastenden angreifen, einfach mal den Spieß umdrehen.
In dem Zonenordner finden wir das Zonenpythonskript zone_1.py und darin kann man unter def on_map_loaded(): so ziemlich am Anfang die Zeilen:
system.create_object('SET_HUMVEE', 375.58, 580.64, id = 'HUMVEE_Z3', direction = 45)
objects.set_attribute('HUMVEE_Z3', 'accepted_drivers', ['UISPIELER'])
einfügen.
Code: Select all
def on_map_loaded():
init_data()
initParties()
npc.initNPCS()
initItems()
initHerbs()
initExitZones()
initFX()
initMinimapMarkers()
## Tiere initialisieren
npc.initAnimals()
## Timer für die Tierspawns
on_timer(data().Timer_SpawnTimeChecker)
#system.notify_timer(data().Timer_SpawnTimeChecker,data().Timervalue_SpawnTimeChecker)
system.create_object('SET_HUMVEE', 375.58, 580.64, id = 'HUMVEE_Z3', direction = 45)
objects.set_attribute('HUMVEE_Z3', 'accepted_drivers', ['UISPIELER'])
objects.set_position(object = "LUCAS",x = 474.0,y = 368.04, grid = "BUILDING_2141_INTERIOR_GRID")
objects.turn_to_direction(object = "LUCAS",direction = DIR_SOUTH)
## Questbook (eingefügt von Roger)
initQuestbook()
init_character_states()
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
Re: Mod-Tagebuch
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Objekte platzieren
Code: Select all
9. Die Bereicherung der Karten mit einzelnen Objekten wäre sicher auch ganz nett.
Mit den Konsolenbefehlen import debug; debug.cheat("map") stehen einem von Beginn an alle Karten zur Verfügung, mit import debug; debug.cheat("teleport") bewegt man sich geschwind über die Karte und kann mit import debug; debug.cheat("pickinfo") alle wichtigen Infos zu den Objekten sammeln.
Im Map-Editor kann man dann aus jedem Zonenordner die zonen.zip entpacken:
zone_1.zip = GNO-Hauptquartier
zone_2.zip = New Safford
zone_3.zip = Bowie Village
zone_4.zip = Casa Verde
zone_5.zip = Spirit Springs
zone_6.zip = Copper Hill
zone_7.zip = Vesseltown
zone_8.zip = Schattenbasis
zone_9.zip = Hidden Cavern
zone_10.zip = Biosphäre
zzone_1.zip = Wastelands
zzone_2.zip = Desert Monks
zzone_3.zip = Labyrinth
zzone_4.zip = Garten Eden
zzone_5.zip = Tres Cabezas
zzone_6.zip = Die Schlucht
zzone_7.zip = Schattenhöhle
zzone_8.zip = Höhlengrab
zzone_9.zip = Vulture Gulch
zzone_10.zip = Bunker
sqzone_1.zip = Mike Ballin
sqzone_2.zip = Konvoi
sqzone_3.zip = Güterbahnhof
sqzone_5.zip = Überfallene Siedlung
sqzone_6.zip = Arena
Eine weitere Möglichkeit Objekte zu platzieren besteht über das Zonenpythonskript zone_X.py unter def on_map_loaded():. Dies wurde weiter oben schon im Thread beschrieben.
Folgende Objekte sind dadurch möglich:
Waffen, Munition, Nahrungsmittel, Medipacks, Medikamente, Kleidung, Krempel, Werkzeuge .... und Fahrzeuge
Vielleicht noch für die Sammler und Jäger etwas zu den Heilkräutern. Diese werden ebenfalls in der zone_X.py jedes Zonenordners definiert.
In unsem Codebeispiel wieder Zone1(GNO-HQ):
Code: Select all
def initHerbs():
# Grab des Vaters
system.create_object(equipmenttype="SET_ALOE_VERA", x=565.07, y=356.50)
# Berg im SW
system.create_object(equipmenttype="SET_WOOD_GARLIC", x=210.75, y=554.40)
# Berg bei Grab
system.create_object(equipmenttype="SET_ALOE_VERA", x=567.03, y=263.60)
# Kuhle im NO (in Basis)
system.create_object(equipmenttype="SET_ALOE_VERA", x=516.84, y=310.27)
# Kuhle im NW (in Basis)
system.create_object(equipmenttype="SET_ALOE_VERA", x=339.73, y=256.12)
# neben Gaestehaus (bei Baeumen)
system.create_object(equipmenttype="SET_ALOE_VERA", x=295.00, y=507.44)
system.create_object(equipmenttype="SET_ALOE_VERA", x=339.73, y=256.12) = Aloe Vera, ok - das war einfach
system.create_object(equipmenttype="SET_WOOD_GARLIC", x=210.75, y=554.40) = Bärlauch
system.create_object(equipmenttype="SET_BURNET", x=325.7, y=288.57) = Bibernelle
system.create_object(equipmenttype="SET_ANGELICA", x=414.48, y=505.36) = Engelswurz
Noch etwas zu den Feuerstellen:
Es gibt 3 verschiedene Feuerstellen. Das große und das mittlere Feuer haben jeweils 9 Sitzplätze (Dummyplätze), das kleine Feuer besitzt 6 Plätze.
Die Feuerstellen und brennenden Mühltonnen sind in jedem Zonenordner in der zone_X.py definiert:
Code: Select all
def initFX():
.
.
.
# brennende Tonne in New Stafford
fxBrennendeTonne("BUILDING_338")
# brennende Tonne Dustville
fxBrennendeTonne('BUILDING_245')
# Lagerfeuer in New Stafford
fxLagerFeuer("BUILDING_3867")
# Lagerfeuer im Ratskull Camp
fxLagerFeuer("BUILDING_3379")
.
.
fxLagerFeuer("ID des Objekts")
Wenn das Feuer also nicht brennt liegt es meistens an einer falschen ID.
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Textveränderung
sripts / globaltext / german / german.py = Waffen, Munition, Ausrüstung ....
sripts / globaltext / german / editor.py = Gegenstände, Gebäude, Pflanzen...
sripts / globaltext / german / names.py = Namen
Man sollte sowohl den "Namen" als auch den "Hint" verändern, z. B.:
Code: Select all
add_global_text(id='SET_MOLOTOV_COCKTAIL_NAME', text='Benzinbombe mit Lunte')
add_global_text(id='SET_MOLOTOV_COCKTAIL_HINT', text='Benzinbombe mit Lunte')
Code: Select all
add_global_text(id='SET_MOLOTOV_COCKTAIL_NAME', text='Molotov Cocktail')
add_global_text(id='SET_MOLOTOV_COCKTAIL_HINT', text='Molotov Cocktail')
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Vergiftung
Code: Select all
if id=="poisoning":
system.notify_global_timer("poisoning", 1000*120)
if not( hasattr(data("rest"), "resting") and data("rest").resting) :
for character_id in system.get_pcs(include_unconscious = True):
if(objects.has_attribute(character_id,"poison_ticks")):
if objects.get_attribute(character_id,"poison_ticks") > 0: #pc is poisoned
objects.set_attribute(character_id,"poison_ticks",objects.get_attribute(character_id,"poison_ticks")-2)
objects.damage( character_id, 2 )
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Tabelle der Erfahrungspunkte
Erfahrungspunkte #Level
Code: Select all
exp_table = [
0, #1
200, #2
500, #3
800, #4
1400, #5
2200, #6
3500, #7
6000, #8
7700, #9
10000, #10
13000, #11
17000, #12
21000, #13
25000, #14
30000, #15
35000, #16
40000, #17
45000, #18
50000, #19
55000, #20
61000, #21
68000, #22
70000, #23
79000, #24
89000, #25
99000, #26
112000, #27
128000, #28
148000, #29
172000, #30
200000, #31
232000, #32
268000, #33
308000, #34
352000, #35
400000, #36
452000, #37
508000, #38
568000, #39
632000, #40
]
Code: Select all
# base exp exp per level
kill_exp = {
"WOLF": (30, 15),
"ANTELOPE": (10, 5),
"BEAR": (40, 20),
"COW": ( 5, 3),
"DEER": (20, 10),
"HORSE": (15, 8),
"TIGER": (50, 25),
"WILDDOG": (30, 15),
"BISON": (15, 8),
"PIG": ( 5, 3),
"DONKEY": ( 5, 3),
"WARG": (60, 30),
"LIZARD_SOMA": (40, 20),
"RAT_SKULLS": (20, 10),
"DESERT_MONKS": (30, 15),
"SHADOWS": (30, 20),
"INDIANS": (20, 10),
"NOMADS": (20, 10),
"GNO_SOLDIERS": (40, 15),
"VILLAGE_PEOPLE": (20, 10),
"SEEKER": (20, 10),
}
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
- Torka
- Jet Dealer
- Posts: 247
- Joined: Thu Mar 25, 2010 5:40 pm
- Location: Östlich des Stuhles des Kaisers wirst du mich finden, ansonsten bin ich Lost in Space
Medikamente, Drogen, Aufputschmittel
In der scripts / objekt_events.py werden nur die Hint-Texte der Drogenwerte verändert, nicht die Wirkung selbst!
Code: Select all
def get_hint_text( ids ):
"""Generates the hint text (i.e., mouse over text/tooltip) for this object.
Parameters:
id - Id of the object.
"""
drugs= {
'SET_DRUGS_PILLS_01': [[globaltext.MISSION_ATTRIBUTE_NAME_STRENGTH,'+2']],
'SET_DRUGS_PILLS_02': [[globaltext.MISSION_ATTRIBUTE_NAME_STRENGTH,'+2'],
[globaltext.MISSION_CREATECHARACTER_HEALTH,'+20%']],
'SET_DRUGS_PILLS_03': [[globaltext.MISSION_CREATECHARACTER_HEALTH,'+25%']],
'SET_DRUGS_PILLS_04': [[globaltext.MISSION_ATTRIBUTE_NAME_CHARISMA,'+2']],
'SET_DRUGS_PILLS_05': [[globaltext.MISSION_ATTRIBUTE_NAME_CHARISMA,'+3']],
'SET_DRUGS_PILLS_06': [[globaltext.MISSION_ATTRIBUTE_NAME_STRENGTH,'+2'],
[globaltext.MISSION_ATTRIBUTE_NAME_AGILITY,'+2'],
[globaltext.MISSION_ATTRIBUTE_NAME_DEXTERITY,'+2'],
[globaltext.MISSION_ATTRIBUTE_NAME_CONSTITUTION,'-4']],
'SET_DRUGS_VIALS_01': [[globaltext.MISSION_ATTRIBUTE_NAME_AGILITY,'+2'],
[globaltext.MISSION_ATTRIBUTE_NAME_DEXTERITY,'+2']],
'SET_DRUGS_VIALS_02': [[globaltext.MISSION_ATTRIBUTE_NAME_STRENGTH,'+3']],
'SET_DRUGS_VIALS_03': [[globaltext.MISSION_ATTRIBUTE_NAME_AGILITY,'+3']],
'SET_DRUGS_SYRINGE': [[globaltext.MISSION_CREATECHARACTER_HEALTH,'+30%']]
}
Code: Select all
create_item_type(typeid='SET_DRUGS_PILLS_02')
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="name", value=globaltext.SET_DRUGS_PILLS_02_NAME)
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="hint", value=globaltext.SET_DRUGS_PILLS_02_HINT)
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="resourceui", value='RES_ITEM65X32_MISCITEM_DRUGS_PILLS_02')
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="resource3d", value='RES3D_DRUGS_PILLS_02')
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="value", value=32.0)
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="weight", value=0.1)
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="stacking", value=10)
objects.set_attribute(object='SET_DRUGS_PILLS_02', attribute="drug_effects", value={
"strength": 2,
"hitpoints": 1.20,
"effect_time": "24:00:00",
})
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_PILLS_01" ) Creatine Max
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_PILLS_02" ) Anabole Steroide
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_PILLS_03" ) Tramaldione
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_PILLS_04" ) Koka
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_PILLS_05" ) Pheromone *
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_PILLS_06" ) Amphetamine *
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_VIALS_01" ) Guarana
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_VIALS_02" ) Androstenedione
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_VIALS_03" ) Ritaldon
object.create_item_in_inventory( "ALTER_EGO", "SET_DRUGS_SYRINGE" ) Palladine
* nicht im Orginalspiel aktiviert
etwa 32 n.s.G.Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert wrote:"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."