Autor Thema: Mod-Tagebuch  (Gelesen 39125 mal)

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Wie fügt man einen zusätzlichen NPC ein?
« Antwort #20 am: 04. August 2010, 13:49:27 Uhr »
Nun versuche ich das, was ich schon lange machen wollte - einen neuen NPC basteln und damit er zu was nütze ist, wird es ein Händler.

Die NPC werden in jedem Zonenordner in der npc.py definiert. Für die GNO-Karte wäre das z.B:  zones / zone_1 / npc.py


# Fine, die Testhändler
system.create_character(
id="FINE",
gender="female",
party="DORFBEWOHNER",
x=370,
y=575,
name=globaltext.NAME_FINE,
direction=300,
resourceui="sue_z7.png")

  objects.set_attribute("FINE", "faction", "VILLAGE_PEOPLE")
objects.set_attribute("FINE", "level", 1 )
  objects.set_attributes("FINE",
model="low",
gender="female",
skin="black",
clothes="sl_003",
face="edeltraud")
character.update_appearance("FINE")
character.scale("FINE",1.70)
objects.set_attribute("FINE", "trader", True)
objects.set_attribute("FINE", "trader_type", "all")
objects.set_attribute("FINE", "voice_id", "trader_03")
objects.create_item_in_inventory("FINE",
[ "SET_M_16",# M4A1
"SET_AMMOPACK_44"]# 1 Packen .44er Munition
+12*["SET_AMMOPACK_7_62NATO_MM"]# 12 Packen 7,62x51 nato Munition
+8*["SET_AMMOPACK_7_62NATO_MM_DUPLEX"]# 8 Packen 7,62x51 nato Duplex
+9*["SET_AMMOPACK_5_45_MM"]# 9 Packen 5,45mm
+7*["SET_AMMOPACK_5_7_MM"]# 7 Packen 5,7mm
+8*["SET_AMMOPACK_5_7_MM_SUBSONIC"]# 8 Packen 5,7mm Subsonicmunition
)
if not hasattr(data(), "patch_patrick"):
data().patch_patrick = 1

Ein paar Anmerkungen:

resourceui="sue_z7.png"  - definiert das Dialogbild des Charakters, zu finden in textures.ubn / textures / characters / human / low / dialog_faces (UBN-Dateien öffnen mit z.B. 7zip)

character.scale("FINE",1.70)  - kann man die Größe des NPC verändern - voll lustig, kann man "Gullivers Reisen"  oder den "Angriff der 20m Frau" spielen  :P

objects.create_item_in_inventory("FINE", ["SET_..."] + 12*["SET_..."] + 8*["SET_..."]) - das Inventar, Art und Anzahl veränderbar (die Preise werden in der scripts / itemdata / items.py oder weopons.py oder ammo.py verändert)


Damit die selbst gewählten Namen (id="FINE") auch im Spiel erscheinen müssen sie definiert werden in scripts / globaltext / german / names.py 

# Zone 1 - Neue TA NPCs
add_global_text(id="NAME_SEAMUS", text="Seamus")
.
.
.
add_global_text(id="NAME_NICK", text="Nick")
add_global_text(id="NAME_FINE", text="Fine")


An dieser Stelle werde ich weitere NPC-Eigenschaften auflisten, wenn ich sie finde:

character.set_approachable_state("RSGUARD_FRONT", NOTAPPROACHABLE)

objects.create_item_in_inventory("RSGUARD_FRONT", ["SET_MP5", "SET_AMMOPACK_9_MM","SET_AMMOPACK_9_MM"])
   
character.equip("RSGUARD_FRONT","SET_MP5")
« Letzte Änderung: 04. August 2010, 14:58: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 le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Mod-Tagebuch
« Antwort #21 am: 04. August 2010, 15:20:07 Uhr »
Sehr schick Torka - meine Hochachtung das du dich so ausdauernd durch die pythonscripts durchwühlst  #thumbsup

Bezüglich Händlern muss ich Lexx wiedersprechen - bei mir ändern die während dem Spiel ihr Angebot bzw. es wird etwas hinzugefügt. Allerdings scheint es dafür ein hartes Limit oder so zu geben - irgendwann tut sich einfach nichts mehr in deren Inventories. Durch "Handelsreisen" kann man z.B. das ein oder andere Rüstungsset vervollständigen - allerdings ist das alles zufallsabhängig.

Beim durchlesen deiner Posts ist mir system_event.py aufgefallen - damit lässt sich bestimmt einiges anstellen (pseudo code):

... eigenen timer registrieren...

# game_init
    system.notify_global_timer("my_system_event_id", my_timer_value_in_milliseconds)

... dann ...

# system_event.py
if id == 'my_system_event_id':
  # new system.notify_global_timer() call to loop event
  re_equip_all_traders()
  do_something_else()
  ...

... sagt die engine nach Ablauf des Timers in system_event bescheid und lässt dich auf den Timer reagieren. Damit sollte es möglich sein Händler periodisch mit neuen Gegenständen auszustatten oder anderen Kram zu machen.

Ich hab The Fall hier nicht installiert, aber wenn du generelle Fragen zu Python hast kann ich dir bestimmt weiterhelfen. :) Dadurch das The Fall Python unterstützt kann man jede Menge Zeug umsetzen, die mit einer limitierten Scriptsprache (wie z.B. die bei Fallout) nicht möglich wäre. Was mir als einzig echtes Limit beim letzten stöbern in den Scripten aufgefallen ist, ist das komplette GUI-System. Das kann man nicht großartig per Script verändern. Irgendwo gibts hier glaub ich nen Thread dazu wo Lexx und ich da mal dran herumgedacht haben.

Grüßsche,
chewie

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Das Händlerupdateskript
« Antwort #22 am: 04. August 2010, 16:36:38 Uhr »
Danke chewie  :). Die Erfahrung der Handelsreisen kann ich teilen und habe gestern den Skriptteil für die Item-Erneuerung der Händler gefunden - muss ihn nur jetzt wiederfinden, da ich gestern nicht recht schlau daraus geworden bin.   
Da ist es, es hat sich in scripts / objekt_events.py versteckt

def on_update_trader( character_id ):
"""Called when the trading panel opens.

Parameters:
        character_id - Id of the trader.
"""

if objects.has_attribute( character_id, "last_trade" ):
last_trade_time = objects.get_attribute(character_id, "last_trade")
act_time = system.get_mission_time()
elapsed_time = act_time - last_trade_time
if elapsed_time >= timerepr.time("60:00:00"):
if objects.has_attribute( character_id, "backup_inventory" ):
act_inventory = objects.get_inventory_list( character_id )
backup_inventory = objects.get_attribute( character_id, "backup_inventory")
missing_objects = backup_inventory[:]
for _id in act_inventory:
if _id in missing_objects:
missing_objects.remove(_id)
if len(missing_objects):
all_items_list = system.get_item_list()
all_items_list = filter(lambda act_item:
(objects.has_attribute(act_item, "item_type") or
objects.has_attribute(act_item, "le_recovery") or
objects.has_attribute(act_item, "armor")), all_items_list)
all_items_list = filter(lambda act_item:
((objects.has_attribute(act_item, "not_tradable") and
not objects.get_attribute(act_item, "not_tradable")) or
not objects.has_attribute(act_item, "not_tradable")), all_items_list)

for item in missing_objects:
_list = helper_get_equivalent_items_list( all_items_list, item )
if len(_list):
new_item = random.choice(_list)
objects.create_item_in_inventory(object=character_id,
equipment=new_item)
backup_inventory.remove(item)
backup_inventory.append(new_item)
else:
inventory_list = objects.get_inventory_list( character_id )
objects.set_attribute( character_id, "backup_inventory", inventory_list)

Wenn ich das hier richtig verstehe werden die Items nach mehr wie 60 Ingamestunden ab dem letzten Kauf wieder ins Inventar befördert. Das funktioniert aber nur bedingt, da dies beim Benzin z.B. nicht geschieht  ??? - wird dieses durch ein anderes aus einer zufälligen Auswahl ersetzt und der Platz (Slot) ist dann besetzt? Hier habe ich noch große Verständnisschwierigkeiten...   

In der scripts / itemdata gibt es in der items.py bei einigen Questgegenständen (z.B. Rattenfelljacke) das Merkmal:

objects.set_attribute(object='SET_RAT_FUR_JACKET', attribute="not_tradable", value=True)  - dies bedeutet dann wohl, das diese Items heraus gefiltert werden.

Hmm, mir is da grad was aufgefallen, versuche einfach mal die Auswahlkriterien mit dem Attribut "value" zu ergänzen und zu Testzwecken wir die Zeit auf 3 Stunden verkürzt.

Das Attribut "value" ist natürlich eins, welches jedes Item besitzt - so waren dann auch munter alle möglichen Sachen dabei, wie z.B. Kupferdraht und das Gesellschaftsspiel *lol* kann man im Spiel nur einmal bauen  #lachen#, war aber fast klar, das der Zufallsgenerator das Benzin nicht ausgewählt hat.

Nun welches Merkmal hat nun das Benzin, welches viele nicht haben?

Ich probiere es mal mit: objects.set_attribute(object='SET_GAS_CANISTER', attribute="fuel", value=20) und nächste Testrunde  :coffee  :wall1cf:*motherfucker :para

Mit dem GUI-System habe ich mich noch fast gar nicht befasst - kommt bestimmt noch  ;D.
« Letzte Änderung: 04. August 2010, 18:41:45 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 le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Mod-Tagebuch
« Antwort #23 am: 04. August 2010, 19:02:09 Uhr »
Hehe - nice find :)

Okay, so versteh ich das:

- der händler hat ein inventory & ein backup_inventory
- die beiden werden verglichen
- wenn backup_inventory mehr "_id"'s hat als das (echte) inventory (act_inventory, wahrscheinlich Kurzform für actor_inventory), dann wird quasi aufgefüllt
- der Auffüllmechanismus ist nicht komplett beliebig - da hier die Funktion helper_get_equivalent_items_list( all_items_list, item) benutzt wird
- pro "missing_object" wird also eine Liste an "ähnlichen Items" generiert - aus der wird dann zufällig eines ausgewählt (random.choice(_list)

Man könnte jetzt diese helper-Funktion umgehen und aus der kompletten Palette auswählen:

for item in missing_objects:
_list = all_items_list[:]
if _list:
new_item = random.choice(_list)
objects.create_item_in_inventory(object=character_id,
equipment=new_item)
backup_inventory.remove(item)
backup_inventory.append(new_item)


Generelle Anmerkungen:
- if _list: ist ähnlich wie if len(_list):, letzteres dürfte aber im Härtefall etwas langsamer sein (wichtig ist in dem Fall aber nur das die Liste nicht leer ist)
- _list = all_item_list[:] erzeugt eine Kopie von all_item_list (Vorraussetzung dafür ist das all_item_list auch wirklich ein Python-Listenobjekt ist ^^)
-  _id und _list sind normale Variablennamen, der Unterstrich dient nur dazu die eingebauten Typen von Python (id und list) nicht zu überschreiben. Kann ein kleines aber fieses Detail sein, über das sich Python erstmal nicht beschwert ;-)
-  zu random.choice: random ist ein modul von Python, choice eine Methode die aus einer beliebigen Python-Liste ein beliebiges Objekt auswählt & zurückgibt (ungemein praktisch ^^)

Man kann aber auch folgendes machen:

- Erstellen von separaten Listen, etwa CraftingItems, Ammo, Weapons, Armors etc.
- aus diesen Listen ein zufälliges Item herausnehmen und dem Händler ins Inventory packen

In dem Zusammenhang wäre interessant ob die Händler ein "unendlich großes" Inventory haben (eigentlich ist ja alles in einer Scrollarea drin) oder ob es ein hartes Limit gibt. Wenn es so eines gibt, dann sollte das System "eins geht raus, ein anderes kommt rein" unbedingt beibehalten, egal woher die neuen Items kommen.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Re: Mod-Tagebuch
« Antwort #24 am: 04. August 2010, 19:48:55 Uhr »
 ;D  - das erweitert doch glatt ein wenig mein Verständnis von dem Skript, obwohl alles noch ein wenig kryptisch ausschaut.

all_items_list = system.get_item_list() - wird hier nicht definiert, das all_items_list der system.get_item_list() gleichgesetzt ist?

Habe es gerade mit all_items_list[:] getestet - es funktioniert, es werden sämtlich verfügbaren Items dem Inventar zugefügt, auch die Pseudomunition (z.B. des Messers). Ist ja so nicht gewollt.

Vorhin habe ich in die if len (missing_objects): das Attribut "fuel" mit hineingesetzt, jetzt kann man zumindest die Benzinflaschen kaufen.

if len(missing_objects):
all_items_list = system.get_item_list()
all_items_list = filter(lambda act_item:
(objects.has_attribute(act_item, "item_type") or
objects.has_attribute(act_item, "le_recovery") or
objects.has_attribute(act_item, "armor") or objects.has_attribute(act_item, "fuel")), all_items_list)


Wie kann ich die Liste, aus der zufällig ein fehlendes Item generiert wird, der  backup_inventory gleichsetzten? Dann werden nur Items aus dem schon von Anfang an vorhandenen Inventar generiert.

for item in missing_objects:
        _list = backup_inventory[:]
if _list:
new_item = random.choice(_list)
objects.create_item_in_inventory(object=character_id,
equipment=new_item)
backup_inventory.remove(item)
backup_inventory.append(new_item)


Werde erstmal testen.

Zitat
In dem Zusammenhang wäre interessant ob die Händler ein "unendlich großes" Inventory haben (eigentlich ist ja alles in einer Scrollarea drin) oder ob es ein hartes Limit gibt. Wenn es so eines gibt, dann sollte das System "eins geht raus, ein anderes kommt rein" unbedingt beibehalten, egal woher die neuen Items kommen.

Sie haben  ;). Habe das als Skript und Randnotiz auch gestern gelesen und mich gefreut. Da ich es aber auch nicht ändern wollte, auch gleich wieder vergessen wo es genau war  ::).
« Letzte Änderung: 04. August 2010, 22:39:29 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 le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Mod-Tagebuch
« Antwort #25 am: 04. August 2010, 20:51:12 Uhr »
Zitat
all_items_list = system.get_item_list()  - wird hier nicht definiert, das all_items_list der system.get_item_list() gleichgesetzt ist?

all_items_list ist ein Variablenname, get_item_list() ist eine Methode der Klasse system (system.get_item_list()). Sprich die Methode ackert etwas vor sich hin und gibt dann eine Liste aller Items zurück. Eigentlich müsste die Methode irgendwo in den Python-Scripten herumfliegen, kann man sich mal bei Gelegenheit näher anschauen.

Zitat
Habe es gerade mit all_items_list[:] getestet - es funktioniert, es werden sämtlich verfügbaren Items dem Inventar zugefügt, auch die Pseudomunition (z.B. des Messers). Ist ja so nicht gewollt.

Yip, du hast auch schon den richtigen Codeschnippsel benutzt um das zu umgehen


all_items_list = filter(lambda act_item:
(objects.has_attribute(act_item, "item_type") or
objects.has_attribute(act_item, "le_recovery") or
objects.has_attribute(act_item, "armor") or objects.has_attribute(act_item, "fuel")), all_items_list)


Das sieht etwas kryptisch aus (liegt auch daran das hier mehrere Sachen geprüft werden, macht aber eigentlich das: nimm die Liste all_items_list und lege alle Items in eine neue Liste (die auch all_items_list heißt) für die gilt das sie die Attribute "item_type", "le_recovery" und "armor" haben.

Er hier

all_items_list = filter(lambda act_item: objects.has_attribute(act_item, "not_tradable"), all_items_list)

sorgt z.B. nur dafür das alle "not_tradable" Items rausfliegen.

Zitat
Wie kann ich die Liste, aus der zufällig ein fehlendes Item generiert wird, der  backup_inventory gleichsetzten? Dann werden nur Items aus dem schon von Anfang an vorhandenen Inventar generiert.

Ich weiß nicht wie sinnvoll das ist - wofür das backup_inventory genau da ist hab ich noch nicht verstanden. Weil: Wenn dem Händlermenü neue Items hinzugefügt werden, dann wird das auch dem Backupmenü hinzugefügt:

[..]
# (remove und append sind Listenoperation)

# lege neues item im inventory an
objects.create_item_in_inventory(object=character_id, equipment=new_item)
# schmeiß altes item aus backup_inventory raus
backup_inventory.remove(item)
# hänge neues item hinten ans backup_inventory ran
backup_inventory.append(new_item)

Wenn du aber den helper auf das backup_inventory loslassen willst, dann so:

_list = helper_get_equivalent_items_list( backup_inventory, item)

Der Helper will als Argumente eine Liste und ein Item: helper_get_equivalent_items_list(<Python list object>, <The Fall Item object>), Rückgabewert ist dann wieder ne Liste die du wie gehabt in random.choice() reinhaust um ein zufälliges Item zu erhalten.


Mal was anderes:

Wegen GUI hab ich den Thread von Lexx wiedergefunden wo wir das schon mal durchgequatscht haben Ist evtl. auch für dich interessant -> http://www.falloutnow.de/forum/index.php?topic=3274.0
« Letzte Änderung: 04. August 2010, 21:04:30 Uhr von chewie »

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Re: Mod-Tagebuch
« Antwort #26 am: 04. August 2010, 22:38:47 Uhr »
Voll geniale Sache, das du dich in Python so auskennst, bin erst seid letzter Woche dazu wie die Jungfrau zum Kind gekommen  ;D - grad `ne kleine Bierrunde in der WG gedreht - mal schauen ob es mit dem Testen noch was wird ...  hmm, (bei den Smileys fehlen irgendwie die Biergläser ...  :'( ;))

Zitat
Ich weiß nicht wie sinnvoll das ist - wofür das backup_inventory genau da ist hab ich noch nicht verstanden. Weil: Wenn dem Händlermenü neue Items hinzugefügt werden, dann wird das auch dem Backupmenü hinzugefügt:

Klar, das nächste Backup enthält vielleicht die zufällig aus dem letzten Backup generierten Items und irgendwann sind dann alle Items gleich (nur so ´ne Theorie) dann sollte jeder Händler schon eine Orginalliste haben und die genommen werden ...

Ich teste mal die Version _list = helper_get_equivalent_items_list( backup_inventory, item)

Zitat
Wegen GUI hab ich den Thread von Lexx wiedergefunden wo wir das schon mal durchgequatscht haben Ist evtl. auch für dich interessant -> http://www.falloutnow.de/forum/index.php?topic=3274.0

Na aber auf alle Fälle, da habe ich doch vor kurzem (auch schon 3 Monate her) schon mal gegraben - ist aber wieder durch die Maschen gefallen  :coffee

Lese gerade deine Verbesseungsideen und erkenne da konvergente Gedanken - echt schön  :D und noch besser habe die Neukombination von zwei Objekten gestern erfolgreich durchgezogen (Schweinefell + Lange Lederschnur = Wasserschlauch, nur ein Test, aber es funzt  #lachen# - Klamotten dürften auch kein Problem sein oder wie wäre der:  Dose + Schwarzpulver + Zünder = Landmine, aber das alles an einen anderen Teil im Thread oder ein neuer wäre am besten oder es gibt ja schon einen, den könnte man wieder zu den neukombinierten Gegenständen reaktivieren  ;)

In den Vorschlägen steckt eine Menge Potential - da werde ich mich nochmal gesondert dazu äußern.

(was wir evtl. mal archivieren sollten - ich würde mich nicht wundern wenn die Seite irgendwann vom Netz geht).  - na, wenn das dann mal nicht so auch war, schade das die Silver Style Leute da kein Bock mehr auf Forum haben

Zitat
Oder man fügt einen NPC bei der GNO ein der einem das Crafting "beibringt" (= Die Rezept-Quest gibt) ;-)


Das Crafting System im Spiel kann schon ganz schön an einem vorbeigehen, wenn man sich nicht außerhalb des Spiels informiert - weiß auch nicht was sich die Entwickler dabei gedacht haben, das man Unmengen von Items sammelt (bei den Staplungswerten und der Slotanzahl) und die dann wild miteinander mischt und hofft, ohne Tips, ohne Anleitung  :neien dabei ist es doch die Neukombination ganz nett, wenn man als Wastlander einen Handwerker trifft (wie bei Morrowind, die Ausbilder oder ein Rezeptbuch) und dieser die Weisheit mit einem teilt.
« Letzte Änderung: 05. August 2010, 00:41:01 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 #27 am: 04. August 2010, 23:12:32 Uhr »
Wer weiß, wie lange Silver Style überhaupt noch existiert. The Games Company hat vor kurzem Insolvenz angemeldet und Carsten ist als Chef zurück getreten, wenn ich mich richtig erinnere. Wage zu bezweifeln, dass das keinen Einfluss auf Silver Style haben wird. Vielleicht sollte mal jemand die Jungs fragen, ob sie nicht bock hätten, einiges an Material vom eingestampften Mutant City weitergeben wollen. Wäre bestimmt nützlich und vor allem cool drin zu graben.
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!
Re: Mod-Tagebuch
« Antwort #28 am: 04. August 2010, 23:37:36 Uhr »
Krass - hab`s gerade auf golem gelesen. Bin auch schon um die Screens zu Mutant City herumgeschlichen und mir so Traumwelten vorgebastelt. Wäre auf alle Fälle eine Bereicherung und schade wenn es im Äther verschwinden würde. 

 #radi2  Schalte erstmal in den Testmodus  #radi2

Zitat
Ich teste mal die Version _list = helper_get_equivalent_items_list( backup_inventory, item)

Wie in der Theorie schon geahnt, in der Praxis nun bestätigt. Die zufällig ersetzten Items füllen die alte Liste auf und aus der neuen Backup werden beim nächsten Mal wieder zufällig welche ausgesucht und besetzten wieder die fehlenden Slots - irgendwann leidet die Vielfalt des Angebots derart. Der Händler hatte in der Testreihe nur noch Unmengen von Zeltplanen am Ende  :wall1cf: und wie kann es auch anders nicht sein, kein einziges mal wieder Benzin.
« Letzte Änderung: 05. August 2010, 00:24:23 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 le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Mod-Tagebuch
« Antwort #29 am: 05. August 2010, 00:45:24 Uhr »
Jap, das macht Sinn - das Backup wird ja angelegt wenn du den Händler aufsuchst. Ich denke du brauchst "frische" Listen um aus denen auszuwählen. Gibts irgendwie ne Kategorie bei den Items? Weil dann könnte man die all_items_list per Filtern gezielt in Ammo / CraftingItems / Armors etc. zerlegen und da dann jeweils ein random.choice() rausziehen.

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Benzin
« Antwort #30 am: 05. August 2010, 01:20:11 Uhr »
Das ist eine gute Idee. Die Objekte und deren Merkmale sind in itemdata in 3 Skripten definiert:  ammo.py , items.py und weapons.py

Nach ein wenig schauen habe ich direkt über dem Traderscript noch das dazugehörige Helperscript gefunden und das Konzept nochmal überdacht. Dort habe ich unter "le_recovery" dann analog auch "fuel" definiert und nun kann man auch erstmalig neue BENZINkanister und -flaschen bei den Händlern finden und tauschen  ;D Das Merkmal "fuel" ist halt zu verlockend, da es nur auf 2 Items (Flasche und Kanister Benzin) in der items.py zutrifft

def helper_get_equivalent_items_list(all_items_list, item ):
"""Helper function for on_update_trader.
"""
value = objects.get_attribute( item, "value" )
items_list = all_items_list[:]
item_type = None
if objects.has_attribute(item, "item_type"):
item_type = objects.get_attribute( item, "item_type" )

if item_type!=None:
result = filter(lambda act_item:
(objects.has_attribute(act_item, "item_type") and
objects.get_attribute(act_item, "item_type")==item_type), items_list)

if objects.has_attribute(item, "le_recovery"):
result = filter(lambda act_item:
objects.has_attribute(act_item, "le_recovery"), items_list)

if objects.has_attribute(item, "fuel"):
result = filter(lambda act_item:
objects.has_attribute(act_item, "fuel"), items_list)

if objects.has_attribute(item, "armor"):
armor = objects.get_attribute(item, "armor")
result = filter(lambda act_item:
(objects.has_attribute(act_item, "armor") and
objects.get_attribute(act_item, "armor")>(armor*0.8) and
objects.get_attribute(act_item, "armor")<(armor*1.2)), items_list)

result = filter(lambda act_item:
(objects.has_attribute(act_item, "value") and
(objects.get_attribute(act_item, "value")>(value*0.8) and
objects.get_attribute(act_item, "value")<(value*1.2))), items_list)

return result

Dennoch bin ich mit dem Grundprinzip des Händlerupdates etwas unzufrieden, da halt nach den Filtern aus einer dann begrenzten Menge von Items einige zufällig ausgewählte Objekte die fehlenden in der Inventarliste ersetzen. Einerseits hilft es die Vielfalt des Inventars zu bereichern, andererseits, wer will schon jedes Mal den Händler leer kaufen um dann zu hoffen, einer der Slots wird wieder zufällig mit Benzin besetzt. Je mehr freie (gekaufte) Objekte dann vorhanden sind, desto höher wird die Chance des Benzineingangs. Da dieses Script ja für alle Händler gilt, kann man ja auch nicht extra einen Tankwart, welcher nur Benzin generiert, erschaffen.
Ich hatte ja bei Miles (versteckter Waffenhändler in Casa Verde) die Hoffnung eine Spezialisierung nur auf Waffen im Skript zu entdecken - dies war sicher auch mal der Gedanke. Die Spezialisierung hat sich im Spiel nicht feststellen lassen und in den Skripten habe ich auch nichts gefunden. Irgendwann kann man alles bei ihm tauschen (bei Morrowind waren die Items auch gut gefiltert und so konnte man nicht überall alles kaufen und verkaufen).

Eine sehr unflexible Idee wäre es, das sich einfach jedes Item aus dem Inventar des Händlers nach einer gewissen Zeit wieder generiert ohne Zufall halt - alles wäre sehr vorhersehbar und man bekäme mit Sicherheit Benzin, nicht erst nach Tauschmarathons und Lotterie.

Eine weitere Idee ist, die Auswahl der zufälligen Objekte nicht nach dem Vergleich der fehlenden Items zu generieren, sondern die Inventarliste des Händlers nach einem Tag z.B. komplett neu zufällig zusammen zu setzten. Nachteile wären, das der Händler nicht mehr als Zwischenspeicher dienen kann, denn man kann nicht darauf vertrauen, das er einen Tag später immer noch das verkaufte Objekt hat. 

Eine andere Idee wäre die Items zu wichten, damit sie gegenüber anderen einfach häufiger ausgewählt werden. Dazu müsste auch zu jedem Item ein neues Merkmal hinzugefügt werden und dieses im Skript verarbeitet werden. Derzeit sehe ich mich aber nicht im Stande, dies mit meiner Skripterfahrung umzusetzten.     
« Letzte Änderung: 05. August 2010, 15:38:40 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 Hornet

  • Highwaymanfahrer
  • Beiträge: 1.493
Re: Mod-Tagebuch
« Antwort #31 am: 05. August 2010, 14:46:11 Uhr »
Größten Respekt für die Arbeit die ihr da investiert. #thumbup
Khilrati schrieb:
Zitat
Wir stellen Fhyngs Mutter als Sling Bubble vor die Tür und jumpen durch das Fenster rein um den Kühlschrank zu hotdroppen und in in den Reinforce zu saufen. Wir sind halt Trux. Die machen sowas.^^

Offline le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Benzin
« Antwort #32 am: 05. August 2010, 17:33:21 Uhr »
Da dieses Script ja für alle Händler gilt, kann man ja auch nicht extra einen Tankwart, welcher nur Benzin generiert, erschaffen.
Ich hatte ja bei Miles (versteckter Waffenhändler in Casa Verde) die Hoffnung eine Spezialisierung nur auf Waffen im Skript zu entdecken - dies war sicher auch mal der Gedanke. Die Spezialisierung hat sich im Spiel nicht feststellen lassen und in den Skripten habe ich auch nichts gefunden. Irgendwann kann man alles bei ihm tauschen (bei Morrowind waren die Items auch gut gefiltert und so konnte man nicht überall alles kaufen und verkaufen).

Da muss ich dich "enttäuschen"  :s000:

Die Funktion ist nicht für alle Händler, sondern arbeitet nur auf dem Inventory des Händlers, den der Spieler gerade besucht:

def on_update_trader( character_id ):
""" Called when the trading panel opens.

Parameters:
        character_id - Id of the trader.
"""

Funktion wird aufgerufen wenn der Handelsbildschirm geöffnet wird, übergebene Charakter-Id ist die des jeweiligen Händlers. (Und die wird dann benutzt um das act_inventory bzw. backup_inventory zu holen)

Eine sehr unflexible Idee wäre es, das sich einfach jedes Item aus dem Inventar des Händlers nach einer gewissen Zeit wieder generiert ohne Zufall halt - alles wäre sehr vorhersehbar und man bekäme mit Sicherheit Benzin, nicht erst nach Tauschmarathons und Lotterie.

Eine weitere Idee ist, die Auswahl der zufälligen Objekte nicht nach dem Vergleich der fehlenden Items zu generieren, sondern die Inventarliste des Händlers nach einem Tag z.B. komplett neu zufällig zusammen zu setzten. Nachteile wären, das der Händler nicht mehr als Zwischenspeicher dienen kann, denn man kann nicht darauf vertrauen, das er einen Tag später immer noch das verkaufte Objekt hat. 

Eine andere Idee wäre die Items zu wichten, damit sie gegenüber anderen einfach häufiger ausgewählt werden. Dazu müsste auch zu jedem Item ein neues Merkmal hinzugefügt werden und dieses im Skript verarbeitet werden. Derzeit sehe ich mich aber nicht im Stande, dies mit meiner Skripterfahrung umzusetzten.     

Wie schon gesagt, dadurch das hier alles in Python abläuft, hast du alle Freiheiten. Du kannst die Händler-Inventare auch komplett überschreiben und sie z.B. zu reinen Waffenhändlern umbauen. Du kannst auch in die Funktion on_update_trader() einen weiteren Check einbauen, der eine auf den Händler zugeschnittene Auffüllfunktion benutzt. Zum Beispiel so (Pseudocode):

def refill_generic_trader():
    #   ... code für den generic trader ...

def refill_weapon_trader():
    # .... code für den weapon traider ...

if character_id == 'ngo-händler':
    helpermethod = refill_generic_trader
elif character_id == 'Miles':
    helpermethod = refill_weapon_trader

helpermethod()


Anmerkungen:
- Funktionen kannst du auch innerhalb einer Funktion erstellen
- du kannst Funktionen in Variablen packen - erst wenn du "()" dranhängst, werden sie ausgeführt (helpermethod ist in dem Beispiel nur ein neuer Name für refill_weapon_trader() etc...)

cheers,
chewie


Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Re: Mod-Tagebuch
« Antwort #33 am: 05. August 2010, 21:48:00 Uhr »
Phu,  :wtf habe gerade das Handelsskript "zerschossen", GsD ein Backup gemacht. Erstmal danke für die Tipps und Korrekturen  #thumbsup. Das hilft für das Verständnis schon ungemein, aber ich merke auch, dass die Umarbeitung des Handelskripts etwas anderes ist als nur Werte zu verändern oder schon geschriebene Skripte einzufügen. Mache erstmal eine Skriptpause und wende mich der Biosphäre zu (bin ja nun schon auf den Showdown gespannt ;))

Ganz schön heftige Auseinandersetzung in der Sphäre  *motherfucker. War jemand schon mal in dem Präsidentenhaus im GNO-HQ? Ich dachte da könnte man dann irgendwann mal rein, da ja auch ein Safe darin steht.   
« Letzte Änderung: 06. August 2010, 01:08:53 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 le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Mod-Tagebuch
« Antwort #34 am: 06. August 2010, 01:34:50 Uhr »
Phu,  :wtf habe gerade das Handelsskript "zerschossen", GsD ein Backup gemacht. Erstmal danke für die Tipps und Korrekturen  #thumbsup. Das hilft für das Verständnis schon ungemein, aber ich merke auch, dass die Umarbeitung des Handelskripts etwas anderes ist als nur Werte zu verändern oder schon geschriebene Skripte einzufügen. Mache erstmal eine Skriptpause und wende mich der Biosphäre zu (bin ja nun schon auf den Showdown gespannt ;))

Das kriegen wir schon hin - solche Tiefs hat man immer mal.   :)  Ich werd mal sehen ob ich es zeitlich schaffe dir was zusammenzutippen.

Ganz schön heftige Auseinandersetzung in der Sphäre  *motherfucker. War jemand schon mal in dem Präsidentenhaus im GNO-HQ? Ich dachte da könnte man dann irgendwann mal rein, da ja auch ein Safe darin steht.  

Jep, da gibts an der nord-östlichen Ecke eine "unsichtbare" Lücke im Zaun - da kannst du unten drunter durchrobben (!). Dürfte das 3te Zaunsegment sein wenn ich mich richtig erinnere.

Spoiler for Hiden:
Ist ein Lederhelmchen drin - den Rest weiß ich nicht mehr ausm Kopp.

Edith

Sodele, ich hab die on_update_trader()-Funktion mal etwas durchdokumentiert und hier und da etwas geändert. Jetzt brauch ich ein paar Infos was du umgesetzt haben willst. Wenn du z.B. "Händlerprofile" haben willst, dann muss ich die Händler-IDs und die bevorzugten Items wissen. Mit denen bau ich dann Fallunterscheidungen ein und bereite individuelle Restock-Helper vor.

Meine Version hab ich auf pastebin geparkt -> http://fall.pastebin.com/drRX4VVU (Ist mit syntax highlighting einfach schöner zu lesen ^^ Beim Download nur nicht copy&paste machen - das mag python nicht. Stattdessen die Option "Raw" benutzen)

cheers,
chewie
« Letzte Änderung: 06. August 2010, 13:59:10 Uhr von chewie »

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Re: Mod-Tagebuch
« Antwort #35 am: 06. August 2010, 23:30:16 Uhr »
Zitat
Jep, da gibts an der nord-östlichen Ecke eine "unsichtbare" Lücke im Zaun - da kannst du unten drunter durchrobben (!). Dürfte das 3te Zaunsegment sein wenn ich mich richtig erinnere.

Na, astrein - Danke - mit ein wenig Gequetsche am Anfang, läuft dann jeder Durchgang problemlos.  #thumbsup

Habe in der der Zwischenmodpause auch gleich nochmal an der Spirit Springs - Karte für den Almanach gesessen - nur noch zwei dann  :D.   

Zitat
Sodele, ich hab die on_update_trader()-Funktion mal etwas durchdokumentiert und hier und da etwas geändert.

Na aber, das sieht  mal schick aus - bin mal erst am schauen ... ich teste es jetzt einfach mal. 

Skript läuft erstmal, wenn man den Händler aber leer kauft regeneriert sich nichts. Wenn er z.B. keine Kleidung mehr hat dann auch diese nicht. 

Vom Orginalskript werde ich aus diesem Teil nicht schlau :

if objects.has_attribute( character_id, "backup_inventory" ):
act_inventory = objects.get_inventory_list( character_id )
backup_inventory = objects.get_attribute( character_id, "backup_inventory")
missing_objects = backup_inventory[:]
for _id in act_inventory:
if _id in missing_objects:
missing_objects.remove(_id)


Über dem Skiptteil stehen noch das Helperskript:

def helper_get_equivalent_items_list(all_items_list, item ):
"""Helper function for on_update_trader.
"""
value = objects.get_attribute( item, "value" )
items_list = all_items_list[:]
item_type = None
if objects.has_attribute(item, "item_type"):
item_type = objects.get_attribute( item, "item_type" )

if item_type!=None:
result = filter(lambda act_item:
(objects.has_attribute(act_item, "item_type") and
objects.get_attribute(act_item, "item_type")==item_type), items_list)

if objects.has_attribute(item, "le_recovery"):
result = filter(lambda act_item:
objects.has_attribute(act_item, "le_recovery"), items_list)

if objects.has_attribute(item, "armor"):
armor = objects.get_attribute(item, "armor")
result = filter(lambda act_item:
(objects.has_attribute(act_item, "armor") and
objects.get_attribute(act_item, "armor")>(armor*0.8) and
objects.get_attribute(act_item, "armor")<(armor*1.2)), items_list)

result = filter(lambda act_item:
(objects.has_attribute(act_item, "value") and
(objects.get_attribute(act_item, "value")>(value*0.8) and
objects.get_attribute(act_item, "value")<(value*1.2))), items_list)

return result

Ich versuche mal die Ideen besser zu ordnen:

Grundidee war einen Tankwart zu erschaffen, dieser sollte einfach nur Benzin haben und verkaufen.
Nach einer gewissen Zeit hat er dann halt wieder welches, also es wird einfach ersetzt.
Die Händler_ID wäre der Name, z. B. "Fritz" und das bevorzugte Item einfach nur GAS_CANISTER. 
Den Zufallsgenerator brauch man dann nicht, einfach nur das Respawnen des Benzins.
Klar hat er dann irgendwann im Inventar auch andere Items, da man ja das Benzin eintauschen muss. Aber nur das Benzin und die Flasche Benzin (BOTTLE_OF_GAS) haben das Attribut "fuel".




 
« Letzte Änderung: 07. August 2010, 02:05: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 le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Mod-Tagebuch
« Antwort #36 am: 07. August 2010, 02:06:26 Uhr »
Vom Orginalskript werde ich aus diesem Teil nicht schlau :

if objects.has_attribute( character_id, "backup_inventory" ):
act_inventory = objects.get_inventory_list( character_id )
backup_inventory = objects.get_attribute( character_id, "backup_inventory")
missing_objects = backup_inventory[:]
for _id in act_inventory:
if _id in missing_objects:
missing_objects.remove(_id)


Ich versuchs mal zu übersetzen:

- Wenn das object mit der id "character_id" das Attribut "backup_inventory" hat, dann
        - hol dir das inventory dieses objekts
        - hol dir das backup_inventory dieses objekts
        - mach eine kopie vom backup_inventory und nenne sie "missing_objects"
        - gehe alle _id's des inventories durch und prüfe, ob sie in "missing_objects" sind
        - wenn ja, dann lösche die jeweilige _id aus "missing_objects"
- ansonsten mach gar nichts

Wenn das durchgelaufen ist, dann ist garantiert keine _id aus dem "act_inventory" mehr in "missing_objects" - und für die Anzahl der verbliebenen Objekte in "missing_objects" wird jetzt aufgefüllt.

Einen kleinen Verdacht habe ich aber jetzt - und zwar warum Handelsreisen irgendwann keine neuen Items mehr generieren. Das müsste man zwar nochmal in Ruhe durchchecken, aber irgendwann ist das backup_inventory leer - und ab dem Zeitpunkt wird nichts mehr nachgefüllt. Das sollte passieren wenn der Check (Originalscript) if len(missing_objects) False ergibt - nämlich missing_objects nur noch eine leere Liste ist.

Grundidee war einen Tankwart zu erschaffen, dieser sollte einfach nur Benzin haben und verkaufen.
Nach einer gewissen Zeit hat er dann halt wieder welches, also es wird einfach ersetzt.
Die Händler_ID wäre der Name, z. B. "Fritz" und das bevorzugte Item einfach nur GAS_CANISTER. 
Den Zufallsgenerator brauch man dann nicht, einfach nur das Respawnen des Benzins.
Klar hat er dann irgendwann im Inventar auch andere Items, da man ja das Benzin eintauschen muss. Aber nur das Benzin und die Flasche Benzin (BOTTLE_OF_GAS) haben das Attribut "fuel".

Na da kommt mir doch gerade eine herrlich einfache Idee:

- Du legst den Benzintrader fest, und haust ihm ne ordentliche Portion Sprit ins Inventory
- Ich schreib eine Fallüberprüfung auf if character_id = Spritdealer: und mach dann folgendes:
     - das Inventory des Spritdealers soll immer mindestens MIN_SPRIT enthalten
     - wenn die Zahl drunter liegt, dann generieren wir eine zufällige Anzahl von Spritkanistern und packen die wieder ins inventory

Sollte klappen, oder? Zufall deswegen: Wir sind immer noch im Ödland - und mal treiben die Scavenger 5l auf, mal 10l - und an einem guten Tag knallen sie noch ein paar Ratskulls übern haufen und erbeuten 15l :>
« Letzte Änderung: 07. August 2010, 02:13:47 Uhr von chewie »

Offline Torka

  • Jet Dealer
  • Beiträge: 170
  • Was für ein Wetter!
Re: Mod-Tagebuch
« Antwort #37 am: 07. August 2010, 15:26:55 Uhr »
Einen kleinen Verdacht habe ich aber jetzt - und zwar warum Handelsreisen irgendwann keine neuen Items mehr generieren.
Das müsste man zwar nochmal in Ruhe durchchecken, aber irgendwann ist das backup_inventory leer - und ab dem Zeitpunkt wird nichts mehr nachgefüllt.
Das sollte passieren wenn der Check (Originalscript) if len(missing_objects) False ergibt - nämlich missing_objects nur noch eine leere Liste ist.

Das könnte stimmen, wenn man nichts mehr von den Händlern kauft, da das Angebot sich nicht ändert - entstehen keine freien Slots, welche durch Zufall wieder aufgefüllt werden. So bleibt das Angebot dann immer gleich. Hatte ja in der Schattenbasis immer noch auf den Raketenwerfer gehofft - dieser ist aber nie angekommen. Ärgerlich ist das bei bestimmter Munition, welche dann einfach nicht mehr respawnt wird  :'( bzw. die ehemaligen Munslots mit anderer Munition besetzt wird.

Aber das später  ;D. Habe dem Inventar der "Spritdealerin Fine" 7 Kanister und 6 Flaschen Benzin gegeben. Die Anzahl kann man aber beliebig verändern ;).

# Fine, die Testhändler
system.create_character(
id="FINE",
gender="female",
party="DORFBEWOHNER",
x=370,
y=585,
name=globaltext.NAME_FINE,
direction=180,
resourceui="sue_z7.png")
  objects.set_attribute("FINE", "faction", "VILLAGE_PEOPLE")
objects.set_attribute("FINE", "level", 1 )
  objects.set_attributes("FINE",
model="low",
gender="female",
skin="black",
clothes="sl_003",
face="edeltraud")
character.update_appearance("FINE")
character.scale("FINE",1.70)

objects.set_attribute("FINE", "trader", True)
objects.set_attribute("FINE", "trader_type", "all")
objects.set_attribute("FINE", "voice_id", "trader_02")
objects.create_item_in_inventory("FINE",
7*["SET_GAS_CANISTER"]        
        +6*["SET_BOTTLE_OF_GAS"]
)
if not hasattr(data(), "patch_patrick"):
data().patch_patrick = 1

chewies  Händlerskript:

def restock_fuel_traders(character_id):
""" check if the given trader is a fuel trader
and restock his inventory (if necessary)

FIXME:
- move _FUEL_TRADERS constant to global scope

@type character_id: string
@param character_id: Id of the trader.
"""
_FUEL_TRADERS = ["FINE",]
_MIN_FUEL = 13

result = False

if character_id in _FUEL_TRADERS:
result = True
act_inventory = objects.get_inventory_list( character_id )

# get all fuel items
fuel_list = filter(lambda item: objects.has_attribute(item, "fuel"), act_inventory)
# restock amount of fuel if necessary
ifuel = len(fuel_list)
if ifuel < _MIN_FUEL:
amount = _MIN_FUEL - ifuel

objects.create_item_in_inventory(
character_id,
amount*["SET_GAS_CANISTER"]
)
objects.create_item_in_inventory(
character_id,
        amount*["SET_BOTTLE_OF_GAS"]
)
return result
« Letzte Änderung: 07. August 2010, 22:29:19 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!
Re: Mod-Tagebuch
« Antwort #38 am: 27. August 2010, 02:00:40 Uhr »
Nach längeren Bedenken habe ich gestern doch einmal einen Brief an Silver Style geschrieben. Darin habe ich gefragt, ob es vielleicht möglich wäre, das schon vorhandene Material des leider eingestellten Addons "Mutant City" auf der offiziellen Seite zum Download frei zu stellen. Auf eine Antwort bin ich sehr gespannt und warte es einfach mal ab  :)

 
Der Bausstil würde sich bestimmt gut in die Wastelands einfügen.
« Letzte Änderung: 27. August 2010, 02:06:20 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 le Chew

  • Vertibirdpilot
  • Beiträge: 1.808
    • zero-projekt.net
Re: Mod-Tagebuch
« Antwort #39 am: 27. August 2010, 02:09:34 Uhr »
Nach längeren Bedenken habe ich gestern doch einmal einen Brief an Silver Style geschrieben. Darin habe ich gefragt, ob es vielleicht möglich wäre, das schon vorhandene Material des leider eingestellten Addons "Mutant City" auf der offiziellen Seite zum Download frei zu stellen. Auf eine Antwort bin ich sehr gespannt und warte es einfach mal ab  :)

Sauber :) Und wenn sie das nicht mehr finden sollten wäre evtl. ein temporäres Auferstehen des alten silverstyle-Forums nice - so das wir die Modding-relevanten Themen hierher migrieren können :)