Autor Thema: Mod-Tagebuch  (Gelesen 39135 mal)

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Mod-Tagebuch
« am: 27. Juli 2010, 23:34:17 Uhr »
Hallo liebe Gamer,

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 ;).   
                           
« Letzte Änderung: 30. Juli 2010, 19:56:18 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Lexx

  • Administrator
  • Auserwähltes Wesen
  • Beiträge: 17.726
Re: Mod-Tagebuch
« Antwort #1 am: 28. Juli 2010, 09:35:05 Uhr »
Zitat
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 ?

Wage zu bezweifeln, dass das möglich ist.

Zitat
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 ?

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.

Zitat
6. Ein wenig mehr Benzin im Spiel wäre nett und Bienenwachs in den Stöcken.

Das Problem hier ist imo, dass beides nicht respawnt. Kein Händler ändert übers Spiel das Warenangebot. Das sollte angepasst werden.
only when you no-life you can exist forever, because what does not live cannot die

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Software
« Antwort #2 am: 28. Juli 2010, 16:38:42 Uhr »
Vorab erst einmal zum "Werkzeug".

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:

# 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:

# which zone to load on campaign start
ENTRY_ZONE = "zones\\zone_8\\zone_8

! SPEICHERN !
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  #party

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.

« Letzte Änderung: 01. August 2010, 19:56:00 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Inventarvergrößerung und Werte der Items ändern
« Antwort #3 am: 28. Juli 2010, 17:34:42 Uhr »
Zitat
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 ?

Wie könnte man diese Idee verwirklichen?

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:

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)

Den markierten Wert in objects.set_attribute(object='SET_BUGGY', attribute="inventory_slots", value=24) einfach auf 48 ändern und schon passen in den Buggy doppelt so viele Sachen rein  :aiee

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:

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"])   

Der Wert der Stapelbarkeit (stacking) kann nun erhöht werden - im Moment am Testen  ::).

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.  :)

Zitat
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?

Funktioniert nach ähnlichem Prinzip wie oben beschrieben, ein Wert wird verändert.  #lachen#

Wir nehmen mein Lieblingsbeispiel - das VERY_NICE_BRACELET (Sehr schöne Armband), zu finden in der Datei scripts / itemdata / items.py

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']]})

Es ist ein kombinierter Gegenstand und besitzt ursprünglich einen Preis von 8. Na toll - die Zähne und die Klauen kann man für je 5 verscherbeln und die Lederschnur für 1, sollte eigentlich 11 ergeben und da ist noch nicht mal eine Wertsteigerung dabei. Es scheint als ob Kunsthandwerk nicht ganz so geschätzt wird.  :neien

Also ich bin für mindestens 12.  #thumbsup

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  :angel:
« Letzte Änderung: 01. August 2010, 21:26:43 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Wasserquellen editieren
« Antwort #4 am: 28. Juli 2010, 19:58:24 Uhr »
Zitat
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?

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.py

Fast am Anfang der Datei (Zeile 84 im  Wing IDE 101 3.2) steht:

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)

d.h. es gibt 2 Wasserquellen, die so gefunden werden können. Ein # deaktiviert immer die jeweilige Zeile für das Spiel, deswegen stehen auch die Kommentare in den Skripten hinter #.
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)

« Letzte Änderung: 01. August 2010, 19:55:12 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Lexx

  • Administrator
  • Auserwähltes Wesen
  • Beiträge: 17.726
Re: Mod-Tagebuch
« Antwort #5 am: 28. Juli 2010, 20:13:05 Uhr »
Wenn du in der on_map_load() Prozedur einer Zone folgende Zeile hinzufügst:

import debug; debug.cheat("pickinfo")
Aktivierst du den Debug-Mode "Pickinfo". Wenn du damit im Spiel auf eine Stelle klickst, werden dir die Koordinaten angezeigt. Damit kannst du ohne viel und unnützes herumprobieren entsprechende Koordinaten bekommen.
only when you no-life you can exist forever, because what does not live cannot die

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Nützliche Konsolenbefehle
« Antwort #6 am: 28. Juli 2010, 21:12:22 Uhr »
Das habe ich doch gleich mal ausprobiert und es erleichtert die Arbeit enorm, da auch noch gleich die IDs angezeigt werden. DANKE  #thumbsup
Ich hatte im Mod-Tutorial davon gelesen, bin aber nicht recht schlau daraus geworden. COOL - Jetzt funzt es  :D.

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  #yay

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

« Letzte Änderung: 01. August 2010, 19:56:47 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Spawnbare Tierwelt
« Antwort #7 am: 28. Juli 2010, 23:34:20 Uhr »
Zurück zu Idee 4

Zitat
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


Normalsterbliche Tiere


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:


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

Respawnte Tiere

Bei den gespawnten Tieren ist es ein wenig komplizierter. Es sind mindestens 4 Pythondateien beteiligt.

Unter script / spawnanimals.py finden man am Anfang eine Liste aller Zonen (Karten), in denen die Tiere immer wieder erscheinen.

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")

Einige Zonen sind mit # deaktiviert. Die restlichen aktiviert. Gerade wenn man auf einer noch deaktivierten Karte zusätzliche gespawnte Tiere erscheinen lassen möchte, erscheinen sie halt nicht, weil in dieser Datei ein # davor steht. Also Zone einfach hier aktivieren und es funktioniert. 

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:

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"]

Wenn man weite Tiere auf der Karte spawnen möchte, müssen die Namen (z.B. "WOLF_S_4") dann auch in die eckigen Klammern in dieser Zeile gesetzt werden.


Die Lokation und die Eigenschaften der gespanten Tiere findet man wieder in der zone_1 / npc.py.

## 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)

Je höher das Level der Tiere, desto mehr Lebenspunkte haben sie.

## Spawnanimals sind feindlich und erstmal inactiv
for animal in data().SpawnAnimals:
objects.set_attribute(animal,"foes", ["UISPIELER"])
objects.set_active_state(animal,INACTIVE)

Die Tiere werden durch objects.set_attribute(animal,"foes", ["UISPIELER"]) mit einem "feindlichen" Verhalten (Raubtiere greifen an, Beutetiere flüchten) versehen.



In der zone_1 / zone_1.py findet man das definierte Zeitintervall für den Respawn der 4 Tiere auf der GNO-Karte
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)
Diese 4 Wölfe erscheinen von 22 bis 6 Uhr westlich des Eingangs zum GNO-HQ.


Ein zweites Beispiel ist das Zeitintervall des Respawns der Tiere auf der Konvoi-Karte, zu finden in der sqzone_2 / sqzone_2.py :
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)
Andere Schreibweise, Tiere sind von 16.00 bis 23.00 Uhr auf der Karte zu finden.
« Letzte Änderung: 07. August 2010, 13:57:32 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Bonuspunkte und Killpoint editieren
« Antwort #8 am: 29. Juli 2010, 02:28:05 Uhr »
Zitat
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.

Das Bonuswertesystem befindet sich am Ende der Datei scipts / global_difines.py

# 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,

              }

Die Werte hinter den Zielgruppen beziehen sich auf die Punkte, welche man für das Eliminieren eines Ziels bekommt.
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:

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

Für die Benutzung einer bestimmten Waffe oder Waffentyps gibt es Bonuspunkte, diese steigen nach der Anzahl der eliminierten Ziele.

"""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)
« Letzte Änderung: 01. August 2010, 19:59:44 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
NPC-Tagesabläufe modifizieren
« Antwort #9 am: 29. Juli 2010, 19:33:06 Uhr »
Zitat
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 :).

;D Es funktioniert - ab 4:30 Uhr ESSEN FASSEN!  ;D


"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...."  #lachen#

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 :aiee
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  #party

"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()]},
« Letzte Änderung: 01. August 2010, 20:00:31 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Smilodon

  • Verbannt
  • Paladin
  • Beiträge: 692
  • Der Letzte seiner Art
Re: Mod-Tagebuch
« Antwort #10 am: 30. Juli 2010, 00:05:17 Uhr »
Ganz ehrlich...find ich gut, das sich jemand mal wieder mit "The Fall" beschäftigt...weiter so... :redfingr:
Wenn du der Meinung bist, Privatsphäre sei egal, nur weil du nichts zu verbergen’ hast, dann kannst du genau so gut sagen, dass Redefreiheit egal sei, nur weil du nichts zu sagen hast.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Platzieren von Items, Bienenwachs und Benzin
« Antwort #11 am: 30. Juli 2010, 12:54:33 Uhr »
Hätte ich am Anfang auch nicht gedacht, dass dies Spiel soviel Potential besitzt. Die Meinungen waren ja teilweise echt vernichtend und wahrscheinlich wurde die 1.0 Version des Spiels zurecht so beurteilt. Dennoch steckt viel Liebe zum Detail darin und damit meine ich nicht die Grafik (diese erfüllt ihren Zweck  ::) man erkennt meistens was gemeint sein soll  #lachen#), sondern das Missionsdesign - schlicht weg die Atmosphäre des Spiels - die Stilmittel wurden gut bis sehr gut verarbeitet. Gerade als alter Morrowindspieler war ich von den Tagesabläufen der NPCs begeistert. Diese Beleben die Karten ungemein, bei Morrowind in der Orginalversion war es ja entweder mit Herumstehen oder Laufen schon getan - bis findige Leute da auch Tagesabläufe den NPCs "eingehaucht" haben.
Die Atmosphäre wurde um Welten besser - auch das Suchen der Questgeber  ???  ;D.
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.
Zitat
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.

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.

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
          .
          .
          .

In der scripts / itemdata / vehicles.py kann man die Tankgröße und den Verbrauch der Fahrzeuge direkt ändern:

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 erste Zeile gibt den aktuellen, die zweite Zeile den Gesamttankinhalt an. Der aktuelle sollte also niemals größer sein als der Gesamttankinhalt.
Die dritte Zeile definiert den Verbrauch, statt 0,00125 einfach auf 0,0005 herunter gehen und der Verbrauch sinkt schon mal deutlich.  ;D
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:

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)

Je nach Erfahrungsstufe sinkt der Benzinverbrauch (0.9 = 10 % bis 0.45 = 55 % weniger Benzinverbrauch)

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.  #hand
« Letzte Änderung: 03. August 2010, 15:01:46 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Lexx

  • Administrator
  • Auserwähltes Wesen
  • Beiträge: 17.726
Re: Mod-Tagebuch
« Antwort #12 am: 30. Juli 2010, 13:12:41 Uhr »
Btw. Wir haben auch [code.] [/code.] Tags. Eventuell solltest du die für die Code-Beispiele nutzen. ;)

Test
only when you no-life you can exist forever, because what does not live cannot die

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Platzieren von Fahrzeugen
« Antwort #13 am: 30. Juli 2010, 13:22:03 Uhr »
Danke, das ist ein guter Tip  #thumbsup. Jo, gefällt mir gut und sieht auch übersichtlicher aus. Die farblichen Markierungen funktionieren dann aber nicht mehr oder kann man das dann irgendwie anders lösen?


Zitat
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.

Für das Platzieren eines Humvees nehmen wir wieder als Beispiel die Karte des GNO-HQs (Zone1).
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.

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()

Der Humvee parkt nun rechts vom Startpunkt am Straßenrand.  :coffee
« Letzte Änderung: 01. August 2010, 20:02:28 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Lexx

  • Administrator
  • Auserwähltes Wesen
  • Beiträge: 17.726
Re: Mod-Tagebuch
« Antwort #14 am: 30. Juli 2010, 13:23:53 Uhr »
Farbliche Markierungen werden nicht mehr gehen, weil alles in reinem Code dargestellt wird.
only when you no-life you can exist forever, because what does not live cannot die

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Objekte platzieren
« Antwort #15 am: 30. Juli 2010, 15:32:11 Uhr »
Ok, danke. Dann werde ich das mal soweit anpassen  :).
 
9. Die Bereicherung der Karten mit einzelnen Objekten wäre sicher auch ganz nett.
Erstens kann man viele Kartenobjekte im Map-Editor platzieren, die Objekte sind dort grob in wenigen Gruppen in der links befindlichen Menüleiste angeordnet. Die beste Möglichkeit ist eh sich ein schönes Objekt, welches man verwenden möchte, auf den Karten direkt im Spiel anzuschauen und sich da die Inspiration zu holen.

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):

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)

Dabei verstecken sich hinter folgenden Befehlen diese Heilpflanzen:

system.create_object(equipmenttype="SET_ALOE_VERA", x=339.73, y=256.12)  = Aloe Vera, ok - das war einfach  #lachen#

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:

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")
               .
               .

Falls man ein neues Lagerfeuer oder eine brennende Tonne platziert entspricht die ID des Objektes dem Speicherpfad. Die ID sollte sinnvoll verkürzt werden, den diese muss in den Skriptbefehl eingesetzt werden, sonst erscheinen keine Animationen. 

fxLagerFeuer("ID des Objekts")

Wenn das Feuer also nicht brennt liegt es meistens an einer falschen ID.
   
« Letzte Änderung: 01. August 2010, 20:05:14 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Textveränderung
« Antwort #16 am: 01. August 2010, 15:19:38 Uhr »
Falls man die Bezeichnungen der Waffen, Gegenstände oder Namen ändern möchte, kann man dieses in folgenden Pythonskripten vornehmen: 

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.:

add_global_text(id='SET_MOLOTOV_COCKTAIL_NAME', text='Benzinbombe mit Lunte')
add_global_text(id='SET_MOLOTOV_COCKTAIL_HINT', text='Benzinbombe mit Lunte')

in

add_global_text(id='SET_MOLOTOV_COCKTAIL_NAME', text='Molotov Cocktail')   
add_global_text(id='SET_MOLOTOV_COCKTAIL_HINT', text='Molotov Cocktail')
« Letzte Änderung: 01. August 2010, 19:53:21 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Vergiftung
« Antwort #17 am: 02. August 2010, 00:23:37 Uhr »
Das Pythonskript scipts / system_event.py beinhaltet das Vergiftungsskript:

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 )

Es werden jeweils 2 Lebenspunkte nach einer gewissen Zeit abgezogen.
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Tabelle der Erfahrungspunkte
« Antwort #18 am: 02. August 2010, 01:12:41 Uhr »
Nach fast ewigen Suchen fand ich die Tabelle der Erfahrungspunkte unter scripts / objekt_events.py :

Erfahrungspunkte    #Level

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
]

Und eine Tabelle über die Erfahrungspunkte für das Erlegen von Feinden und Tieren, nicht verwechseln mit den Killpoints für die allgemeinen Bonuspunkte.

# 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),
}
« Letzte Änderung: 02. August 2010, 01:22:09 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Medikamente, Drogen, Aufputschmittel
« Antwort #19 am: 02. August 2010, 13:40:09 Uhr »
Falls man die Drogen im Spiel editieren möchte, kann man dies in den folgenden 2 Pythonskripten vornehmen:

In der scripts / objekt_events.py werden nur die Hint-Texte der Drogenwerte verändert, nicht die Wirkung selbst!

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%']]
}

Die Wirkung bzw. die Drogenwerte ändert man in scripts / itemdata / items.py z.B: für Anabole Steroide

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",
})

Mit folgenden Konsolenbefehlen kann man dies dann im neu gestarteten Spiel testen:

   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
« Letzte Änderung: 04. August 2010, 12:43:49 Uhr von Torka »
Zitat von: Typ auf Hügel an einem See, der jetzt jedes Jahr einen Zentimeter seines Wasserspiegels verliert
"So wie ihr von den Menschen behandelt werden möchtet, so behandelt sie auch. Denn das ist die Botschaft des Gesetztes und der Propheten."
etwa 32 n.s.G.