Mod-Tagebuch

Allgemeine Diskussion und (Mod-)Support zu Silver Style's The Fall - Last Days of Gaia.

Moderators: Newsposter, Global Moderator, Zugriff Intern, Moderator

User avatar
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

Post by Torka »

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 ;).   
                           
Last edited by Torka on Fri Jul 30, 2010 7:56 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
Lexx
Administrator
Posts: 27348
Joined: Sat Dec 10, 2005 6:27 pm

Re: Mod-Tagebuch

Post by Lexx »

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

Post by Torka »

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:

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
! 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.
Last edited by Torka on Sun Aug 01, 2010 7:56 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

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:

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

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

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']]})
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:
Last edited by Torka on Sun Aug 01, 2010 9:26 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

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:

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)
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)
Last edited by Torka on Sun Aug 01, 2010 7:55 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
Lexx
Administrator
Posts: 27348
Joined: Sat Dec 10, 2005 6:27 pm

Re: Mod-Tagebuch

Post by Lexx »

Wenn du in der on_map_load() Prozedur einer Zone folgende Zeile hinzufügst:

Code: Select all

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
User avatar
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

Post by Torka »

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
Last edited by Torka on Sun Aug 01, 2010 7:56 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

Zurück zu Idee 4
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:

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

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

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

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)
Je höher das Level der Tiere, desto mehr Lebenspunkte haben sie.

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

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

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)
Andere Schreibweise, Tiere sind von 16.00 bis 23.00 Uhr auf der Karte zu finden.
Last edited by Torka on Sat Aug 07, 2010 1:57 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

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

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,

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

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
Für die Benutzung einer bestimmten Waffe oder Waffentyps gibt es Bonuspunkte, diese steigen nach der Anzahl der eliminierten Ziele.

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)
Last edited by Torka on Sun Aug 01, 2010 7:59 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

10. Das Hinzufügen von neuen NPC mit Tagesabläufen eventuell, an Missionen will ich mal noch gar nicht denken, da das für mich noch weit hinter dem Horizont liegt.                          
Es entspricht zwar nicht der Reihenfolge der Ideenpunkte, aber da die Sache so gut funktioniert, schreib ich sie gleich mal auf.
In der shedules.py von Zone 1 (GNO-HQ) habe ich gerade ein nicht aktiviertes Skript des Ausbilders gefunden. In dieser Datei, welche auch in jedem Zonenordner zu finden ist, werden die Tagesabläufe der NPCs definiert.
Ein wenig dran herum gespielt und es zum Laufen gebracht.

Code: Select all

"DRILL_INSTRUCTOR" : ( # der Ausbilder
##################
{	#TA1: Tutorial nicht genommen:
	S_CONDITION  : lambda: data().training_activated and not data().training_done,
	"00:00:00" : { #
		S_START  : [],
		S_LOOP   : [turn_to_object("ALTER_EGO")]},                                                                 .
},{	#TA2: nach dem Tutorial:
	"00:30:00" : { # Schlafen                                                            
		S_START  : [goto(460.25, 346.90),
			    enter_building('BUILDING_1883'),
			    lay_down_to_sleep('THE FALL_BUILDING_3965')],
		S_LOOP   : [sleep()]},
	"04:30:00" : { # Warten
		S_START  : [leave_building('BUILDING_1883'),
			    goto(320.8,326.6),
			    turn_to_direction(global_defines.DIR_EAST)],
		S_LOOP   : []},
	"21:00:00" : { # Trainigsparcours laufen
		S_START  : [],
		S_LOOP   : [patrol(((297.0,353.0),(309.0,343.0),(309.0,293.0),(292.0,293.0)))]},
	"00:00:00" : { # Warten
		S_START  : [goto(320.8,326.6),
			    	turn_to_direction(global_defines.DIR_EAST)],
		S_LOOP   : []}
}),
Bisher stand er auch nach dem Training blöd in der Sonne oder halt unter dem Mond. Jetzt gönnt er sich mal einen kleinen Lauf und geht schlafen. Mal schauen ob man ihn zum Essen bewegen kann :).

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

Code: Select all

"DRILL_INSTRUCTOR" : ( # der Ausbilder
##################
{	#TA1: Tutorial nicht genommen:
	S_CONDITION  : lambda: data().training_activated and not data().training_done,
	"00:00:00" : { #
		S_START  : [],
		S_LOOP   : [turn_to_object("ALTER_EGO")]},
},{	#TA2: nach dem Tutorial:
	"00:30:00" : { # Schlafen
		S_START  : [goto(460.25, 346.90),
			    enter_building('BUILDING_1883'),
			    lay_down_to_sleep('THE FALL_BUILDING_3965')],
		S_LOOP   : [sleep()]},
	"04:30:00" : { # Essen und Trinken
		S_START  : [leave_building('BUILDING_1883'),
			    goto_dummy("BUILDING_867","dmyp_001"), sit_down_on_bench()],
		S_LOOP   : sit_eat_drink_on_bench},
	"06:30:00" : { # Warten
		S_START  : [goto(320.8,326.6),
			    turn_to_direction(global_defines.DIR_EAST)],
		S_LOOP   : []},
	"21:00:00" : { # Trainigsparcours laufen
		S_START  : [],
		S_LOOP   : [patrol(((297.0,353.0),(309.0,343.0),(309.0,293.0),(292.0,293.0)))]},
	"00:00:00" : { # Warten
		S_START  : [goto(320.8,326.6),
			    	turn_to_direction(global_defines.DIR_EAST)],
		S_LOOP   : []}
}), 
Jede Tätigkeit hat so ihre eigene Schleife, die solange durchläuft, bis das Zeitintervall abgelaufen ist. So steht der Ausbilder 4:30 Uhr auf und läuft zum Feuer, setzt sich auf eine Bank und isst bis 6:30 Uhr. Wow, wenn man bedenkt wie viele NPCs einen Tagesablauf haben, ist das schon eine Leistung. Ist ein wenig wie im Film, "...laufe dahin, mache das...."  #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()]},
Last edited by Torka on Sun Aug 01, 2010 8:00 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
Smilodon
Highwaymanfahrer
Posts: 1019
Joined: Tue Feb 28, 2006 8:06 pm
Location: Frankfurt/Main

Re: Mod-Tagebuch

Post by Smilodon »

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

Post by Torka »

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

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
          .
          .
          .
In der scripts / itemdata / vehicles.py kann man die Tankgröße und den Verbrauch der Fahrzeuge direkt ändern:

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

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) 
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
Last edited by Torka on Tue Aug 03, 2010 3:01 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
Lexx
Administrator
Posts: 27348
Joined: Sat Dec 10, 2005 6:27 pm

Re: Mod-Tagebuch

Post by Lexx »

Btw. Wir haben auch [code.] [/code.] Tags. Eventuell solltest du die für die Code-Beispiele nutzen. ;)

Code: Select all

Test
only when you no-life you can exist forever, because what does not live cannot die
User avatar
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

Post by Torka »

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?

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.

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()
Der Humvee parkt nun rechts vom Startpunkt am Straßenrand.  :coffee
Last edited by Torka on Sun Aug 01, 2010 8:02 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
Lexx
Administrator
Posts: 27348
Joined: Sat Dec 10, 2005 6:27 pm

Re: Mod-Tagebuch

Post by Lexx »

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
User avatar
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

Post by Torka »

Ok, danke. Dann werde ich das mal soweit anpassen  :).
 

Code: Select all

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

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

Image

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")
               .
               . 
	
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.
Last edited by Torka on Sun Aug 01, 2010 8:05 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

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

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') 
in

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')
Last edited by Torka on Sun Aug 01, 2010 7:53 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

Das Pythonskript scipts / system_event.py beinhaltet das Vergiftungsskript:

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 )
Es werden jeweils 2 Lebenspunkte nach einer gewissen Zeit abgezogen.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

Nach fast ewigen Suchen fand ich die Tabelle der Erfahrungspunkte unter scripts / objekt_events.py :

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
	]
Und eine Tabelle über die Erfahrungspunkte für das Erlegen von Feinden und Tieren, nicht verwechseln mit den Killpoints für die allgemeinen Bonuspunkte.

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),
}
Last edited by Torka on Mon Aug 02, 2010 1:22 am, edited 1 time in total.
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."
etwa 32 n.s.G.
User avatar
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

Post by Torka »

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!

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%']]	
	}
Die Wirkung bzw. die Drogenwerte ändert man in scripts / itemdata / items.py z.B: für Anabole Steroide

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",
})
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
Last edited by Torka on Wed Aug 04, 2010 12:43 pm, edited 1 time in total.
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."
etwa 32 n.s.G.
Post Reply

Return to “The Fall”