Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Page 1 of 4 1234 Last »
Results 1 to 20 of 67
  1. View Forum Posts #1 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline

    [daedalus] Direkter Zugriff auf ZenGin-Objekte

    Dieses "Forschungs"-Projekt befindet sich erst in den Anfängen. Da ich in der nächsten Zeit mit anderen Dingen beschäftigt bin, veröffentliche ich bereits jetzt den ersten (grundsätzlich funktionierenden) aktuellen Stand. Vielleicht findet jemand die Informationen nützlich...

    Allerdings sollte die übliche Warnung nicht fehlen: Die Skriptklassen beschreiben den Speicherbereich genau einer Version von Gothic - sollte es sich um eine andere Version handeln, könnte der Speicher anders aussehen!
    (nun, man kann diverse Konsistenzprüfungen einbauen, um die Korrektheit der Klassendefinition zu testen)

    Gruß Nico
    Attached Files
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Last edited by NicoDE; 03.03.2010 at 13:07.

  2. #2 Reply With Quote
    Don Bilbo
    Gast
     
    Hmm hört sich ja ganz interessant an.

    Aber was kann man genau damit machen?

  3. View Forum Posts #3 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Auf Eigenschaften zugreifen, auf die man normalerweise keinen Zugriff hat.
    Code:
    Npc.vob_bitfield = Npc.vob_bitfield | zCVob_bitfield0_drawBBox3D;
    Da Klassenreferenzen in Klassen nicht funktionieren (bzw. ich bisher keine Idee habe, wie man das in Daedalus anstellen könnte), ist das ganze relativ limitiert (man kann also nicht auf die referenzierten Objekte zugreifen).
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Last edited by NicoDE; 03.03.2010 at 15:07.

  4. Visit Homepage View Forum Posts #4 Reply With Quote
    Exodus Sektenspinner's Avatar
    Join Date
    Jul 2004
    Location
    Karlsruhe
    Posts
    7,827
     
    Sektenspinner is offline
    Interessant! Ich sehe noch kein konkretes Feature, was sich damit implementieren ließe (ich habe aber auch nicht alles durchgesehen), aber wer weiß, wofür sich diese "Grundlagenforschung" noch alles nutzen lässt?
    Für Scripter könnte sich das als wahre Schatztruhe entpuppen.

    Gute Arbeit. Danke!
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Last edited by Sektenspinner; 12.07.2009 at 20:50.

  5. View Forum Posts #5 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Es gab mal einen Thread, in dem (sehr aufwändig) versucht wurde, Positionen und Entfernungen zu bestimmen. Das könnte damit etwas einfacher werden.

    edit: Nein, ich habe keinen Link. Und ich weiß aus dem Stegreif auch nicht, wonach ich suchen sollte.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Last edited by NicoDE; 13.07.2009 at 08:48.

  6. Visit Homepage View Forum Posts #6 Reply With Quote
    Ehrengarde Syrill's Avatar
    Join Date
    Nov 2007
    Location
    Bayern
    Posts
    2,494
     
    Syrill is offline
    Quote Originally Posted by NicoDE View Post
    Es gab mal einen Thread, in dem (sehr aufwändig) versucht wurde, Positionen und Entfernungen zu bestimmen. Das könnte damit etwas einfacher werden.
    hast du vielleicht den Link?
    A little hard work never killed anyone important.

    Syrill auf Facebook
    und auf Instagram
    uuuund Twitter!

  7. View Forum Posts #7 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Auf Nachfrage per PN:

    percList[66] ist ein unsortiertes Array mit 33 Einträgen, welche aus einer var int percID (siehe PERC_Xxx in Constants.d) und einer var func percFunc (siehe B_AssessXxx.d) besteht. percActive enthält die Anzahl von genutzten Einträgen in percList (Achtung: die Einträge sind weder sortiert, noch fortlaufend).
    Aus den Skripten wird percList mit den Externals Npc_PercEnable und Npc_PercDisable bearbeitet.

    Hinweis: Die External Perc_SetRange ändert die Einträge in einer globalen Liste - sie gelten also für alle oCNpc.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

  8. View Forum Posts #8 Reply With Quote
    now also in your universe  Milky-Way's Avatar
    Join Date
    Jun 2007
    Posts
    14,055
     
    Milky-Way is offline
    Quote Originally Posted by NicoDE View Post
    edit: Nein, ich habe keinen Link. Und ich weiß aus dem Stegreif auch nicht, wonach ich suchen sollte.
    Ich konnte mich an einen solchen Thread erinnern, in dem es einen Lösungsvorschlag mit Dreiecken gab. Nach "dreieck" gesucht und
    http://forum.worldofplayers.de/forum...hlight=dreieck

    Edit: Das kann eigentlich nicht der Thread sein, den ich gemeint hatte, da ich zu dem Zeitpunkt hier nicht aktiv war.
    Ich hatte sowieso mehr daran gedacht, dass es in Verbindung mit einem Kompass war.
    http://forum.worldofplayers.de/forum...hlight=dreieck

  9. View Forum Posts #9 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Für den Kompass könnte man den AtVector aus der Object-To-World-Transformation auslesen. Das Problem ist "nur", dass der Daedalus-Parser von Gothic keine float-Arrays mag. Man müsste es als int-Array deklarieren (muss man ohnehin, da man mit den Fließkommazahlen normalerweise in Daedalus nicht viel machen kann).
    Code:
    func void ShowHeroAtVector()
    {
      var zCVob Vob; Vob = Hlp_GetNpc( Hlp_GetInstanceId( hero ) );
      var int At0; At0 = Vob.trafoObjToWorld[2];   // 4 * 0 + 2
      var int At1; At1 = Vob.trafoObjToWorld[6];   // 4 * 1 + 2
      var int At2; At2 = Vob.trafoObjToWorld[10];  // 4 * 2 + 2
      var int Doc; Doc = Doc_Create();
      Doc_SetPages( Doc, 2 );
      Doc_SetPage( Doc, 0, "Book_Red_L.tga", 0 );
      Doc_SetPage( Doc, 1, "Book_Red_R.tga", 0 );
      Doc_SetMargins( Doc, 0, 275, 20, 30, 20, TRUE );
      Doc_SetMargins( Doc, 1, 30, 20, 275, 20, TRUE );
      Doc_SetFont( Doc, -1, "Font_15_Book.tga" );
      Doc_PrintLine( Doc, 0, "" );                   Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "Hero.GetAtVector()" ); Doc_PrintLine( Doc, 1, "" );
      Doc_SetFont( Doc, -1, "Font_10_Book.tga" );
      Doc_PrintLine( Doc, 0, "" );      Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "At[0]" ); Doc_PrintLine( Doc, 1, IntToString( At0 ) );
      Doc_PrintLine( Doc, 0, "" );      Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "At[1]" ); Doc_PrintLine( Doc, 1, IntToString( At1 ) );
      Doc_PrintLine( Doc, 0, "" );      Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "At[2]" ); Doc_PrintLine( Doc, 1, IntToString( At2 ) );
      Doc_Show( Doc );
    };
    
    instance HeroAtVector( C_Item )
    {
      Name        = "Hero’s AtVector";
      MainFlag    = ITEM_KAT_NONE;
      Visual      = "ItWr_Book_02_04.3ds";
      Material    = MAT_LEATHER;
      ScemeName   = "MAP";	
      Description = Name;
      On_State[0] = ShowHeroAtVector;
    };
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Last edited by NicoDE; 13.07.2009 at 14:03.

  10. Visit Homepage View Forum Posts #10 Reply With Quote
    General Nodrog's Avatar
    Join Date
    May 2005
    Location
    Dresden
    Posts
    3,145
     
    Nodrog is offline
    Was die Floating Arrays betrifft:
    Ist das "nur" eine Schwachstelle des Übersetztens in den Binärcode der Gothic.dat? Oder kommt die Engine allgemein nicht damit klar, auch wenn der Compiler es richtig übersetzt?
    Ich kann mir nicht vorstellen, dass nur der Parser als Komponente des Compilers damit Schwierigkeiten hat.

    Also mein unwissendes Wirrwar übersetzt: Würde es das Problem beheben, wenn ein es einen Compiler gäbe, der richtig übersetzt?
    In dem Fall würde dein anderer Thread mit der Auflistung von Tokens ja sehr helfen.

    Edit: Was außerdem interessant wäre: Hat man auch Zugriff auf Objekte, die an Bones geheftet sind? zB Helme, Waffen oder Bierkrüge?
    Und was noch interessant wäre, wäre Zugriff auf AniOverlays. Die Objektliste muss ja auch irgendwo am Npc vermerkt sein.
    Last edited by Nodrog; 14.07.2009 at 13:36.

  11. View Forum Posts #11 Reply With Quote
    Ehrengarde HolyWater's Avatar
    Join Date
    Aug 2007
    Posts
    2,214
     
    HolyWater is offline
    Quote Originally Posted by NicoDE View Post
    Für den Kompass könnte man den AtVector aus der Object-To-World-Transformation auslesen. Das Problem ist "nur", dass der Daedalus-Parser von Gothic keine float-Arrays mag. Man müsste es als int-Array deklarieren (muss man ohnehin, da man mit den Fließkommazahlen normalerweise in Daedalus nicht viel machen kann).
    Code:
    func void ShowHeroAtVector()
    {
      var zCVob Vob; Vob = Hlp_GetNpc( Hlp_GetInstanceId( hero ) );
      var int At0; At0 = Vob.trafoObjToWorld[2];   // 4 * 0 + 2
      var int At1; At1 = Vob.trafoObjToWorld[6];   // 4 * 1 + 2
      var int At2; At2 = Vob.trafoObjToWorld[10];  // 4 * 2 + 2
      var int Doc; Doc = Doc_Create();
      Doc_SetPages( Doc, 2 );
      Doc_SetPage( Doc, 0, "Book_Red_L.tga", 0 );
      Doc_SetPage( Doc, 1, "Book_Red_R.tga", 0 );
      Doc_SetMargins( Doc, 0, 275, 20, 30, 20, TRUE );
      Doc_SetMargins( Doc, 1, 30, 20, 275, 20, TRUE );
      Doc_SetFont( Doc, -1, "Font_15_Book.tga" );
      Doc_PrintLine( Doc, 0, "" );                   Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "Hero.GetAtVector()" ); Doc_PrintLine( Doc, 1, "" );
      Doc_SetFont( Doc, -1, "Font_10_Book.tga" );
      Doc_PrintLine( Doc, 0, "" );      Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "At[0]" ); Doc_PrintLine( Doc, 1, IntToString( At0 ) );
      Doc_PrintLine( Doc, 0, "" );      Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "At[1]" ); Doc_PrintLine( Doc, 1, IntToString( At1 ) );
      Doc_PrintLine( Doc, 0, "" );      Doc_PrintLine( Doc, 1, "" );
      Doc_PrintLine( Doc, 0, "At[2]" ); Doc_PrintLine( Doc, 1, IntToString( At2 ) );
      Doc_Show( Doc );
    };
    
    instance HeroAtVector( C_Item )
    {
      Name        = "Hero’s AtVector";
      MainFlag    = ITEM_KAT_NONE;
      Visual      = "ItWr_Book_02_04.3ds";
      Material    = MAT_LEATHER;
      ScemeName   = "MAP";	
      Description = Name;
      On_State[0] = ShowHeroAtVector;
    };
    ich hätte gedacht der vektor is vom typ zVEC3 und nich zMATRIX4?!
    ♥ HolyWater ♥ YAY xD

  12. View Forum Posts #12 Reply With Quote
    Deus Oparilames's Avatar
    Join Date
    May 2004
    Location
    ex contrariis
    Posts
    10,958
     
    Oparilames is offline
    Quote Originally Posted by NicoDE View Post
    Für den Kompass könnte man den AtVector aus der Object-To-World-Transformation auslesen. Das Problem ist "nur", dass der Daedalus-Parser von Gothic keine float-Arrays mag. Man müsste es als int-Array deklarieren (muss man ohnehin, da man mit den Fließkommazahlen normalerweise in Daedalus nicht viel machen kann).
    Code:
    [...]
    Hallo NicoDE!
    Erstmal danke für dieses tolle Projekt.
    Leider muss ich gestehen, dass deine Kompassmethode nicht funktioniert.
    Was auch immer ich probiere: Fehler über Fehler. (Ziemlicht oft falscher Datentyp).

    Ich habe auch schon versucht Sektenspinners Float-Script zu verwenden, aber auch das hilft nicht.
    Hast du das Script auch bei dir ausprobiert gehabt?
    Außerdem ist mir schleierhaft, warum du beim Kompass zCVob und nicht oCNpc verwendet hast.

    Hier sind inetwa alle Versuche, die ich unternommen habe (zu großen Teilen auskommentiert.)
    Code:
    func void ShowHeroAtVector()
    {
      var oCNpc Npc; Npc = Hlp_GetNpc( Hlp_GetInstanceId( hero ) );
      var zCVob Vob; Vob = Hlp_GetNpc( Hlp_GetInstanceId( hero ) );
      var int MOD_pi; MOD_pi = 31415926535;//897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885867869956909257107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086169286809208747609178249385890097149096759852613655497818931297848216829989487226588048575640142704775551323796414515237462343645428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426912397489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396380952572010654858632788659361533818279682303019520353018529689957736225994;/*138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039638095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900956794520809514655022523160388193014209376213785595663893778708303906979207734672218256259966150142150306803844773454920260541466592520149744285073251866600213243408819071048633173464965145390579626856100550810665879699816357473638405257145910289706414011097120628043903975951567715770042033786993600723055876317635942187312514712053292819182618612586732157919841484882916447060957527069572209175671167229109816909152801735067127485832228718352093539657251210835791513698820914442100675103346711031412671113699086585163983150197016515116851714376576183515565088490998985998238734552833163550764791853589322618548963213293308985706420467525907091548141654985946163718027098199430992448895757128289059232332609729971208443357326548938239119325974636673058360414281388303203824903758985243744170291327656180937734440307074692112019130203303801976211011004492932151608424448596376698389522868478312355265821314495768572624334418930396864262434107732269780280731891544110104468232527162010526522721116603963809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590095679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039638095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900956794520809514655022523160388193014209376213785595663893778708303906979207734672218256259966150142150306803844773454920260541466592520149744285073251866600213243408819071048633173464965145390579626856100550810665879699816357473638405257145910289706414011097120628043903975951567715770042033786993600723055876317635942187312514712053292819182618612586732157919841484882916447060957527069572209175671167229109816909152801735067127485832228718352093539657251210835791513698820914442100675103346711031412671113699086585163983150197016515116851714376576183515565088490998985998238734552833163550764791853589322618548963213293308985706420467525907091548141654985946163718027098199430992448895757128289059232332609729971208443357326548938239119325974636673058360414281388303203824903758985243744170291327656180937734440307074692112019130203303801976211011004492932151608424448596376698389522868478312355265821314495768572624334418930396864262434107732269780280731891544110104468232527162010526522721116603963809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590095679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039638095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900956794520809514655022523160388193014209376213785595663893778708303906979207734672218256259966150142150306803844773454920260541466592520149744285073251866600213243408819071048633173464965145390579626856100550810665879699816357473638405257145910289706414011097120628043903975951567715770042033786993600723055876317635942187312514712053292819182618612586732157919841484882916447060957527069572209175671167229109816909152801735067127485832228718352093539657251210835791513698820914442100675103346711031412671113699086585163983150197016515116851714376576183515565088490998985998238734552833163550764791853589322618548963213293308985706420467525907091548141654985946163718027098199430992448895757128289059232332609729971208443357326548938239119325974636673058360414281388303203824903758985243744170291327656180937734440307074692112019130203303801976211011004492932151608424448596376698389522868478312355265821314495768572624334418930396864262434107732269780280731891544110104468232527162010526522721116603963809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590095679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180270981994309924488957571282890592323326097299712084433573265489382391193259746366730583604142813883032038249037589852437441702913276561809377344403070746921120191302033038019762110110044929321516084244485963766983895228684783123552658213144957685726243344189303968642624341077322697802807318915441101044682325271620105265227211166039638095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590093809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595082953311686172785588907509838175463746493931925506040092770167113900984882401285836160356370766010471018194295559619894676783744944825537977472684710404753464620804668425906949129331367702898915210475216205696602405803815019351125338243003558764024749647326391419927260426992279678235478163600934172164121992458631503028618297455570674983850549458858692699569092721079750930295532116534498720275596023648066549911988183479775356636980742654252786255181841757467289097777279380008164706001614524919217321721477235014144197356854816136115735255213347574184946843852332390739414333454776241686251898356948556209921922218427255025425688767179049460165346680498862723279178608578438382796797668145410095388378636095068006422512520511739298489608412848862694560424196528502221066118630674427862203919494504712371378696095636437191728746776465757396241389086583264599581339047802759009380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900536331942571882619016852091109444623049387276226013009665098018150216116189314991755448664845101939640892424535185862966853588072370252086290396375135442408416767961062540774535439718720220389829258815048817462632144019324591263846776453878214900321873605288401615814676934097243424966959679745512952152475413003838241759677554225154868903498467584610663159419881211797133452509275307014085614263503015271473708797902296635683001787990288084193893922491884489117670080380387588878016977011134533491153480210658508757002551736325688200975955274871225357182551697875315095569086898546483794843035187061492313573402963136527912761526230610431409239565352297493261018023574144940020107575292488958929324580351889348336232266211070472227951789643113533222151331112813026996570565423666607124273606758337678351910125109944370304629076346614964495599673032125852284006812886320601384391535239320911579060473413936297323492759180894233656526093948313364810290643586311830825965878597847150234490787476787995667424852051040103999757103940220630691734742020896991756005288898736759396629367401720982195418337128233932862477317196438625665314551269922236776677708198643496799841526045194640459016395789604927913929104349027568381726840470522981408906713149152625044175452710112357868012989368284933913963833660781422917945543449168097066491318845378120257962155232128839888294830960254154515830155645623132845031741857697997991078955656799608252916553758612233838070069219579639419837426117676769100507357501471041273917783596347944115924160740964918923864162314431509843379999957412386084556879065017966046590401190093106491459764550874416917093615978054671746589930170413753904682544419849306977396303361433004032263704413884245648531960009102403591486043419567188919858561565546577508901443177712861645686219001284594607421607429571045831400462012463901102101932368874623187463906390518460908247466122225868317169890636064025404893508750600193538323584777977777184156692711224004455167705419310730388369438797889046242175900466660910401636227006450671672563298135619169577585613333903982775996522509904038709327898622159549437997063064807096494177080058122705593309162118440046358937856324358641910615400682047879016214044578771739810295260717300099121797113754243334882266618671805934535003597940626101694558948798528738239461925927383005865786236901271929638265926393781959687776344919278138391527346851031712835011677541289696340176336880334761324250065479448355160024231256646080107867025860376099390800451756260090655554130984042735743005006687743313528206170729903389370532225467004205889640465239361428307918540416966678324070955958770942320094156109555343344349138543884086108248624289859619741256571704240067876712368593537227109156704060621943472602;*/
      var int bla;  bla = roundf(mkf(MOD_PI));
    /*  var float xyz; xyz = Vob.trafoObjToWorld[2];
      var float zyx; zyx = Npc._zCVob_trafoObjToWorld[2];*/
      
      //var int At0; At0 = roundf(mkf(Vob.trafoObjToWorld[2]));   // 4 * 0 + 2
      var int At00; At00 = roundf(mkf(Npc._zCVob_trafoObjToWorld[2]));   // 4 * 0 + 2
      /*
      var int At1; At1 = Npc.trafoObjToWorld[6];   // 4 * 1 + 2
      var int At2; At2 = Npc.trafoObjToWorld[10];  // 4 * 2 + 2
      */
    Was in aller Hergottsnamen mache ich denn da falsch?
    Die andere Funktion. die du uns geschrieben hast funktioniert einwandfrei und auch einige Versucher meinerseits funktionieren, nur bei Floats gibt es halt extreme Probleme.

    Welchen Umfang soll das Projekt denn eigentlich letztenendes haben? Alle Klassen von Gothic inklusve der Menüs? Oder "nur" Npcs Items und 1 oder 2 andere Vob-Klassen im Spacer.
    Dass das ganze viel Zeit in Anspruch nehmen wird, also länger dauert ist klar, das hast du ja bereits im Einleitungsbeitrag geschrieben.
    Oparilames nachdem er seinen Gesellenbrief erhalten hat:
    »Das war's mit dir, du Mistvieh!«

  13. Visit Homepage View Forum Posts #13 Reply With Quote
    Exodus Sektenspinner's Avatar
    Join Date
    Jul 2004
    Location
    Karlsruhe
    Posts
    7,827
     
    Sektenspinner is offline
    Ohne mir das jetzt genau angeschaut zu haben:
    Da Daedalus keine floats unterstützt sollte trafoObjToWorld syntaktisch als Integer Array deklariert werden, obwohl semantisch floats enthalten sind.
    Nur so ist es möglich überhaupt Informationen aus ihnen herauszubekommen.

    Selbst kannst du dann zwar trotzdem erstmal nichts damit anfangen, aber meine float Implementierung kann das.

    Code:
    var int At00; At00 = roundf(mkf(Npc._zCVob_trafoObjToWorld[2]));
    Das ist so nicht sinnvoll, da Npc._zCVob_trafoObjToWorld[2] ein float ist, mein mkf aber dazu da ist, einen Integer in einen (semantischen) float zu verwandeln. Da kommt nur Datenmüll raus, wenn du einen float einsetzt.
    Stattdessen kannst du Npc._zCVob_trafoObjToWorld[2] direkt in meiner float Implementierung verwenden, falls Gothic das gleiche Floating-Point Format verwendet (was eigentlich garantiert der Fall ist).
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  14. View Forum Posts #14 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Quote Originally Posted by HolyWater View Post
    ich hätte gedacht der vektor is vom typ zVEC3 und nich zMATRIX4?!
    oCNpc::GetAtVector liefert einen zVEC3, dessen Daten aus der zMAT4 extrahiert werden ([0][2], [1][2], [2][2]).

    Quote Originally Posted by Oparilames View Post
    Was in aller Hergottsnamen mache ich denn da falsch?
    Nichts.
    Ich hatte alle "float" in den Klassen bereits in "int" geändert. Deshalb funktioniert das letzte Skript nicht mit den oben angehängten Klassen.
    Da Daedalus das Lesen aus float-Arrays verweigerte, versuchte ich zwei Klassen zu definieren (float/int), um den Wert aus dem Array in einen anderen Wert der Klassen zu kopieren. Aber als ich dann feststellen durfte, dass ich float-Werte an Klassen nicht setzen darf... habe ich alles auf int umgestellt.

    zCVob oder oCNpc ist egal, da oCNpc von zCVob abgeleitet ist und letztere bereits eine V-Table hat. Ich verwende im Beispiel eine External, da der Lexer bei Externals, die ein Instanzobjekt zurückgeben, nicht den Klassentyp prüft.
    Möglicherweise bekommt man dadurch (Direktzugriff + Npc_GetEnemy) Zugriff auf die referenzierten Objekte - das wichtigste zu lösende Problem, da man dann die Listen durchlaufen kann...

    Falls jemand zu viel Zeit hat: FltToString (mit BCDs?) und SoftFloat nach Daedalus portieren :)

    ps: Klassen in Daedalus sind einfache Speicherbeschreibungen. "string" ist eine Ableitung von std::string (MSVC6) mit V-Table (sizeof(zSTRING) == 0x14).
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Last edited by NicoDE; 15.07.2009 at 22:17.

  15. View Forum Posts #15 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline

    Post thread linking

    Quote Originally Posted by NicoDE View Post
    FltToString (mit BCDs?)
    Gibt es inzwischen hier.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

  16. View Forum Posts #16 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Ich habe die beiden Scripte im ersten Beitrag aktualisiert (wie vorher bereits angesprochen), weil man mit var float (jetzt var int) und var string name[n] (jetzt var string name; var string name_<1,n-1>) in Daedalus nicht vernünftig arbeiten kann.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

  17. View Forum Posts #17 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Auf Anfrage, Nachtrag zu trafoObjToWorld:
    Code:
       +   |       0       |      1     |      2      |       3       |
    -------+---------------+------------+-------------+---------------+
     0 * 4 | RightVector X | UpVector X | OutVector X | Translation X |
    -------+---------------+------------+-------------+---------------+
     1 * 4 | RightVector Y | UpVector Y | OutVector Y | Translation Y |
    -------+---------------+------------+-------------+---------------+
     2 * 4 | RightVector Z | UpVector Z | OutVector Z | Translation Z |
    -------+---------------+------------+-------------+---------------+
     3 * 4 |               |            |             |               |
    -------+---------------+------------+-------------+---------------+
    OutVector (AtVector) ist die "Blickrichtung" und Translation ist die "Position".

    Rotation matrix (or direction cosine matrix, DCM)
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Last edited by NicoDE; 25.01.2010 at 13:28.

  18. Visit Homepage View Forum Posts #18 Reply With Quote
    Exodus Sektenspinner's Avatar
    Join Date
    Jul 2004
    Location
    Karlsruhe
    Posts
    7,827
     
    Sektenspinner is offline

    Speicher beliebig auslesen

    Es ist möglich eine beliebige Stelle im Speicher zu lesen.

    Die Kurzfassung:
    Code:
    func int MemReadInt (var int address) {
    	/* other = address - MEM_NpcID_Offset */
    	MEM_Helper.enemy = address - MEM_NpcID_Offset;
    	Npc_GetTarget (MEM_Helper);
    	
    	/* res = *(other + oCNpc_idx_offset) */
    	return other.id;
    };
    Die Langfassung:
    Code:
    //######################################################
    //
    //	Elementare Read-Write Operationen
    //
    //######################################################
    
    var oCNpc MEM_Helper;
    var C_NPC MEM_oldOth; //other hier zwischenspeichern
    const int MEM_NpcID_Offset = 288; //0x120
    const int MEM_NpcName_Offset = 292; //0x124
    
    func void MemReadOpen() {
    	MEM_Helper = Hlp_GetNpc (MEM_HELPER_INST);
    	
    	if (!Hlp_IsValidNpc (MEM_Helper)) {
    		//self zwischenspeichern
    		MEM_oldOth = Hlp_GetNpc (self);
    		Wld_InsertNpc (MEM_HELPER_INST, MEM_FARFARAWAY);
    		MEM_Helper = Hlp_GetNpc (self);
    		self = Hlp_GetNpc (MEM_oldOth);
    	};
    	
    	MEM_oldOth = Hlp_GetNpc (other);
    };
    
    func int MemReadInt (var int address) {
    	/* other = address - MEM_NpcID_Offset */
    	MEM_Helper.enemy = address - MEM_NpcID_Offset;
    	Npc_GetTarget (MEM_Helper);
    	
    	/* res = *(other + oCNpc_idx_offset) */
    	return other.id;
    };
    
    func string MemReadString (var int address) {
    	/* other = address - MEM_NpcID_Offset */
    	MEM_Helper.enemy = address - MEM_NpcName_Offset;
    	Npc_GetTarget (MEM_Helper);
    	
    	/* res = *(other + oCNpc_idx_offset) */
    	return other.name;
    };
    
    func void MemWriteInt (var int address, var int val) {
    	/* other = address - MEM_NpcID_Offset */
    	MEM_Helper.enemy = address - MEM_NpcID_Offset;
    	Npc_GetTarget (MEM_Helper);
    	
    	/* *(other + oCNpc_idx_offset) = val */
    	other.id = val;
    };
    
    func void MemWriteString (var int address, var string val) {
    	/* other = address - MEM_NpcID_Offset */
    	MEM_Helper.enemy = address - MEM_NpcName_Offset;
    	Npc_GetTarget (MEM_Helper);
    	
    	/* *(other + oCNpc_idx_offset) = val */
    	other.name = val;
    };
    
    func void MemReadClose() {
    	/* Alte Werte wiederherstellen, sonst Absturz! */
    	MEM_Helper.enemy = 0;
    	other = Hlp_GetNpc (MEM_oldOth);
    };
    
    //######################################################
    //
    //	Einzelzugriffe, mit ReadOpen geöffnet und ReadClose beendet.
    //
    //######################################################
    
    func int GetIntAt (var int address) {
    	var int res;
    	MemReadOpen();
    	res = MemReadInt (address);
    	MemReadClose();
    	return res;
    };
    
    func void SetIntAt (var int address, var int val) {
    	MemReadOpen();
    	MemWriteInt (address, val);
    	MemReadClose();
    };
    
    func string GetStringAt (var int address) {
    	var string res;
    	MemReadOpen();
    	res = MemReadString (address);
    	MemReadClose();
    	return res;
    };
    
    func void SetStringAt (var int address, var string val) {
    	MemReadOpen();
    	MemWriteString (address, val);
    	MemReadClose();
    };
    Ich werde jetzt erstmal Klausur schreiben gehen, und dann im Laufe der Woche das etwas aufarbeiten und ein paar Adressen raussuchen.

    Im Prinzip kann man jetzt ALLES lesen und schreiben. In Xardas Worten:
    Quote Originally Posted by Xardas
    Ich beginne gerade erst zu begreifen, welche Möglichkeiten sich mir eröffnen!
    Vermutlich kommt man an den Objektbaum von Gothic heran und kann mit beliebigen Vobs beliebiges machen. Vermutlich kriegt man zum Beispiel hin (total aus der Luft gegriffene Beispiele):
    • Truheninhalte bearbeiten und Truhen auf und abschließen
    • Menü <-> Content Kommunikation
    • pfxe zur Laufzeit bearbeiten
    • Vobs sichtbar und unsichtbar machen
    • uvm


    Was super wäre, was ich aber nicht weiß, ob man es hinkriegt:
    • Beliebige Engine Funktionen aufrufen
    • Schnelle Dynamische Arrays, die beim Weltenwechsel erhalten bleiben.
    • Schnelle Schleifen durch Manipulation des Parser Stacks
    • Neue Objekte erzeugten und Objekte entfernen.
    • Erhöhung der Alpha-Vob Zahl


    Weitere Ideen und Lösungsvorschläge oder gar gleich der Code für ein Feature sind sehr willkommen.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Last edited by Sektenspinner; 01.03.2010 at 11:52.

  19. View Forum Posts #19 Reply With Quote
    research NicoDE's Avatar
    Join Date
    Dec 2004
    Posts
    7,404
     
    NicoDE is offline
    Neuer/geänderter ausführbarer Code wird schwierig, da man durch die Datenausführungsverhinderung (Data Execution Prevention, DEP) standardmäßig keinen Schreibzugriff auf die ausführbaren Speicherbereiche hat. Das kann man zwar mit VirtualProtect anpassen - aber dann besteht immer noch das Problem, diese native Funktion aus den Skripten aufzurufen.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor

  20. Visit Homepage View Forum Posts #20 Reply With Quote
    Exodus Sektenspinner's Avatar
    Join Date
    Jul 2004
    Location
    Karlsruhe
    Posts
    7,827
     
    Sektenspinner is offline
    Zum Ausführen von Funktionen: Ohne mir alles ganz genau angeschaut zu haben:
    Für mich sieht das aus, als könnte man zPAR_TOK_CALLEXTERN sowie einen manipulierten Symbolindex auf den Stack schieben und dann DoStack den Rest erledigen lassen.

    Ist die Frage, wie bindend der Typ "Funktion mit boolschem Rückgabewert und ohne Parameter" ist, der beim Cast gefordert ist. Ob man es auch hinbekommt Enginefunktionen ohne Rückgabewert oder mit Parametern aufzurufen?

    Scriptintern hin und her springen sollte auch gehen. "Einfach" eine zum Aufrufen bestimmte Funktion als INSTANCE deklarieren und dann zPAR_TOK_CALL und die StackPosition der Instanz auf den Stack schieben.

    Wie "auf den Stack schieben" geht, wenn man gerade auf dem Stack arbeitet muss ich mir noch überlegen.
    Vielleicht kann man auch eine lange sinnlose Funktion deklarieren und diese gemütlich von außen überschreiben und dann ganz normal aufrufen.

    Edit: Irgendwie hab ich das Gefühl, der Code Stack ist gar kein Stack. Von daher ist der als letztes genannte Ansatz wohl der einzig mögliche.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Last edited by Sektenspinner; 01.03.2010 at 13:43.

Page 1 of 4 1234 Last »

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide