Banner left   Banner center   Banner right

Germanenglish Home · News · Diary · Screenshots · Documentation (Wiki) · Downloads · Guestbook · Forum

Home · Benutzer registrieren · Suchen · Statistik · FAQ · Benutzerliste

Zur Zeit online: keiner ausser dir

 X-Force - Fight For Destiny - Forum —› X-Skript / Developer-Pack —› Scriptfrage

Autor Mitteilung
verfasst am: 21.11.2011, 18:04
Registrierdatum: 20.07.2005, 00:01

 Beiträge: 203
Moin, bin mal wieder im Lande.

Kann mir einer einen Hinweis geben, wieso folgendes Skript in der V0.917A03 nicht mehr läuft? In der V0915b04 hat das noch gefunzt.

program Laenderunterstuetzung;

const Wochenminuten = 10080;

var Credittimer : TTimerEvent;

procedure Getcredits(Sender: TOBJECT);
var
  NewBudget : LongInt;
  i : Integer;
begin
  Credittimer.Interval:=Wochenminuten;
  // savegame_api_Message(inttostr(Credittimer.Interval),lmMissionMessage,N il);
  
  for i := 0 to country_api_GetCountrycount - 1 do
  begin

  // Buggetberechnung Vertrauen des Landes*1000
  // also zwischen 0 und 100000 Credits
  // + Bevölkerungsbonus auch noch mal in Relation zum Vertrauen
  // so das nochmal 0 bis 50000 Bonuscredits kommen können.
  // 50000 Bonus schafft aber nur China, die anderen Ländern dürften
  // bei 20000 Bonus max. liegen für Bevölkerungsbonus,
  // wenn Vertrauen auf 100 ist.
  // das ganze geteilt durch drei, das anstatt 1.500.000 Gesamtetat
  // ca. 500000 Gesamtetat extra kommt
  // und +40%/+20%/+-0%/-20%/-40% für den Schwierigkeitsgrad.
  // wobei hier noch die Variable Dooms missbraucht wird, die passend
  // zum jeweiligen Schwierigkeitsgrad auf 1 bis 5 gesetzt ist

  // TODO: eigene Variable für Länderunterstützung setzen

  NewBudget := country_api_getCountryByIndex(i).Friendly*1000;
  NewBudget := NewBudget+round(country_api_getCountryByIndex(i).Friendly*country_api_ getCountryByIndex(i).Einwohner/2000000);
  NewBudget := round(NewBudget/3);
  NewBudget := round(NewBudget/100*(160-game_api_GetInteger('Dooms')*20));
  
  // savegame_api_Message(inttostr(NewBudget),lmMissionMessage,Nil);

  country_api_ChangeBudget(i,NewBudget);

  end;

end;

procedure StartMission;

begin
   Credittimer := register_timed_event(@GetCredits,NIL,Wochenminuten-1);
   Credittimer.Repeated :=true;
end;

begin
  MissionName:='credits';
  MissionType:=mzUser;
end.

verfasst am: 22.11.2011, 00:13
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Zwischen den Versionen sind einige Befehle umbenannt worden und es gab auch einige weitere Änderungen. Allerdings habe ich nicht alles auswendig im Kopf und keine Zeit, das aus dem Quellcode herauszusuchen.

Es würde also sehr helfen, wenn Du uns sagst was für Fehlermeldungen Du bekommst oder was auf einmal nicht funktionieren soll...
verfasst am: 22.11.2011, 06:53
Registrierdatum: 01.10.2011, 15:10

 Beiträge: 51
in der dritte NewBudgetzeile hast du stehen:
country_api_ getCountryByIndex
nach dem 2. Unterstrich ist ein leerzeichen, das muss auf alle fälle mal weg

GreeZ.ALK
verfasst am: 22.11.2011, 15:05
Registrierdatum: 20.07.2005, 00:01

 Beiträge: 203
Zitat: ALKOHOL
nach dem 2. Unterstrich ist ein leerzeichen, das muss auf alle fälle mal weg


Hm, muss beim Copy/Pasten da irgendwie mit reingekommen sein? Im Script direkt ist der nicht.


Zitat: DirkF
Es würde also sehr helfen, wenn Du uns sagst was für Fehlermeldungen Du bekommst oder was auf einmal nicht funktionieren soll...


Hatte gestern keine Zeit, das noch weiter einzugrenzen, war einfach ein Versuch schonmal hier zu posten wegen Hilfe.

Habe das jetzt weiter eingegrenzt.

Fehlermeldung gibt es nicht.
Script wird auch sauber zum richtigen Zeitpunktausgelöst.
Script wird komplett abgearbeitet. Es wird auch was berechnet.

Fehler liegt irgendwo hier?

  NewBudget := country_api_getCountryByIndex(i).Friendly*1000;
  NewBudget := NewBudget+round(country_api_getCountryByIndex(i).Friendly*country_api_ getCountryByIndex(i).Einwohner/2000000);
  NewBudget := round(NewBudget/3);
  NewBudget := round(NewBudget/100*(160-game_api_GetInteger('Dooms')*20));



Während ich in der V0915b04 noch Werte im Bereich ca. 20000 bis 100000 da bekommen habe, ergibt die gleiche Logik in der V0.917A03 jetzt nur noch Werte von ca. 20 bis 100 für NewBudget? Sieht nach einen Faktorverlust von 1000 aus?

Ich kann das Problem bei Zeiten noch weiter eingrenzen, aber vielleicht sieht ja schon jemand das Problem?
verfasst am: 22.11.2011, 19:31
Registrierdatum: 01.10.2011, 15:10

 Beiträge: 51
mach es wie ich zum "debuggen"
mach nach ejder zeile ein game_api_messagebox(inttostr(NewBudget));
Dann kannst den Fehler noch besser verfolgen, bzw sogar identifizieren.
verfasst am: 22.11.2011, 20:26 · Edited by: Kamor
Registrierdatum: 20.07.2005, 00:01

 Beiträge: 203
Jo, war jetzt der nächste Schritt.

Problem liegt an den Abfragen

country_api_getCountryByIndex(i).Friendly
und
country_api_getCountryByIndex(i).Einwohner

Ich habe mal jeweils 4*4 Werte per messagebox ausgeben lassen.

Was bei der V0915b04 noch funktioniert hat, sah so aus.

Format: Friendly*1000 -> + Einwohner/200000 -> /3 -> mal Levelmodifikation ...

83000 -> 96276 -> 32092 -> 44929
50000 -> 51822 -> 17274 -> 24184
100000 -> 115554 -> 38518 -> 53925
37000 -> 37227 -> 12409 -> 17374

Bei der V0.917A03 sieht es jetzt so aus

32 -> 32 -> 11 -> 15
200 -> 200 -> 67 -> 94
160 -> 160 -> 53 -> 74
120 -> 120 -> 40 -> 56

Scheint als wenn
country_api_getCountryByIndex(i).Friendly
nun komplett andere Werte liefert
und
country_api_getCountryByIndex(i).Einwohner
mir nur noch 0-Werte liefert.

Edit: Könnte auch ein Typenproblem, bzw. eine Veränderung in der Wertigkeit der Typen in Formeln sein.

Evtl. das in der V0915b04

NewBudget := country_api_getCountryByIndex(i).Friendly*1000;

[Longint]=[Byte]*1000 vorher auf der rechten Seite ein sauberen LongInt erzeugte
nun aber in der V0.917A03

der Ausdruck [Byte]*1000 vom Ergebnis Byte ist, wobei es natürlich dann zu massiven Überläufen kommt.

Das erklärt die Werte im Bereich unter 256.

Bei der zweiten Formel

NewBudget := NewBudget+round(country_api_getCountryByIndex(i).Friendly*country_api_ getCountryByIndex(i).Einwohner/2000000);

Einwohner/200000 greift wahrscheinlich jetzt eine LongInteger-Rundung, die Konsequent diesen Ausdruck auf 0 Werte rundet.

Gib es in Delphi (X-Script) sowas wie Typenerzwingung in den Formeln?
verfasst am: 23.11.2011, 07:11
Registrierdatum: 01.10.2011, 15:10

 Beiträge: 51
als alternative zur freundschaft könntest ja auch das vertrauen nehmen:

game_api_GetConfidenceByIndex(i)
ist ein wert von 0-100, welcher glaub ich passen würde.

zu den einwohnern hab ich noch die bitte, dass du dir die Einwohner mal seperat anzeigen lässt.
oder was bei mir mal witzig war, dass der / nicht funktionierte, sondern der div-befehl.
vielleicht findest was.
viel glück

GreeZ.ALK
verfasst am: 23.11.2011, 07:46
Registrierdatum: 01.10.2011, 15:10

 Beiträge: 51
so, ich hab nochmal nachgehakt und selber getestet.
mit dem formelismus den du da gebaut hast komm ich selber zu seltsamen ergebnissen, deshalb hab ich das mal etwas umstrukturiert.

    
Einwohner := country_api_getcountrybyindex(0).einwohner;
Freundschaft := country_api_getcountrybyindex(0).friendly;

 game_api_messagebox(inttostr(Einwohner));
 game_api_messagebox(inttostr(Freundschaft));

 NewBudget := Freundschaft*1000;
 game_api_messagebox(inttostr(NewBudget));

 NewBudget := NewBudget + Freundschaft*Einwohner div 2000000;
 game_api_messagebox(inttostr(NewBudget));

 NewBudget := round(NewBudget/3);
 game_api_messagebox(inttostr(NewBudget));

 NewBudget := round(NewBudget/100*(160-1*20));
 game_api_messagebox(inttostr(NewBudget)+' Ende');




bei 320M einwohner und vertrauen von 50 komm ich auf ca.23k in Amerika meines spielsatzes.
denke das sollte hinkommen.

GreeZ.ALK

P.S.: ich habe deine Dooms mit dem wert 1 belegt.
verfasst am: 23.11.2011, 15:27
Registrierdatum: 20.07.2005, 00:01

 Beiträge: 203
Jo, danke dir, für die Zeit. Werde dann mal das Skript dementsprechend umarbeiten.

Habe das "Problem" noch ein bissel weiter recheriert.

hier im Beispiel, zwei Variablen, eine vom Typ Byte und die andere vom Typ Integer, das Ergebnis soll dann in eine Integer. Zweimal die gleiche Rechnung nur die Summanden vertauscht.


procedure Test(Sender: TOBJECT);
var
  var1 : Byte;
  var2 : Integer;
  erg : Integer;
  
begin
  var1 := 255;
  var2 := 1;

  erg := var1 + var2;
  savegame_api_Message(inttostr(erg),lmMissionMessage,Nil);

  erg := var2 + var1;
  savegame_api_Message(inttostr(erg),lmMissionMessage,Nil);
end;



in der V0915b04

bekomme ich für
var 1 + var 2 = 256
var 2 + var 1 = 256

in der V0917a03
bekomme ich für
var 1 + var 2 = 0
var 2 + var 1 = 256

in der v0917a03 hängt das Ergebnis also jetzt vom Variablentypen des ersten Summanden ab.
verfasst am: 23.11.2011, 16:33 · Edited by: DirkF
Admin, Spielsatz GalWar

Registrierdatum: 31.08.2005, 21:51

 Beiträge: 5595
Bitte Poste das Problem im Mantis, damit die Info nicht verloren geht.

Das Problem dürfte mit der Vorzeichenumwandlung und/oder der Art, wie die Zahlen intern gespeichert werden, zusammenhängen.

Teste auch mal mit Char anstatt von Byte - es könnte sein daß das Problem daher kommt, dass Byte von -127 bis +128 (Vorzeichenbehaftet) zählt, das Char dagegen muss immer 0-255 (ohne Vorzeichen) sein.
verfasst am: 23.11.2011, 18:55 · Edited by: Kamor
Registrierdatum: 20.07.2005, 00:01

 Beiträge: 203
Hm, Vorzeichenwandlung hat da glaube nichts mit zu tun.
http://doc.xforce-online.de/ger_pages/XSkriptReferenz/TypByte.html
Byte wird da klar von 0 bis 255 definiert.

Ich meine das ist der klassische Typecast, nur ein bischen streng jetzt bei euch seit der v0917a03.

255+1 sind 0 wenn man das auf Byte Ebene berechnet. Bei 256 kommt der Überlauf zur 0.

255+1 sind 256 wenn man dementsprechend eine größere Variable hat.

Ist halt nur ein bischen hart, wenn da halt ein Autotypencast greift und das in der Form das erst rechts auf Byteebene gerechnet wird, weil der erste Summand ein Byte ist und dann das berechnete und mehrmals überlaufende Byte dann in die Integervariable erg rübergegeben wird.

Hier wäre das Äquivalent in C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test2
{
    class Program
    {
        static void Main(string[] args)
        {
            byte var1 = 255;
            int var2 = 1;

            int erg;


            erg = (byte) (var1 + var2);
            Console.WriteLine(erg);
            erg = var2 + var1;
            Console.WriteLine(erg);
        }
    }
}



nur das ich hier halt in der ersten Rechung nach der Addition von var1 und var2 das Byte dann per Typecast erzwinge, bevor ich es dann weiter zur Integer erg reiche.
Bei euch passiert das halt "default" mässig. ;-)
verfasst am: 26.11.2011, 12:57
Registrierdatum: 20.07.2005, 00:01

 Beiträge: 203
Habe den Typecast jetzt für X-Script gefunden.

procedure Test(Sender: TOBJECT);
var
  var1 : Byte;
  var2 : Integer;
  erg : Integer;
  
begin
  var1 := 255;
  var2 := 1;

  erg:=integer(var1)+var2;
  savegame_api_Message(inttostr(erg),lmMissionMessage,Nil);

  erg:=var2+integer(var1);
  savegame_api_Message(inttostr(erg),lmMissionMessage,Nil);
end;



Durch den Typecast integer(var1) verhindere ich hier, das rechts auf Byteebene gerechnet wird. Beide Rechnungen ergeben dann 256.

Soll das jetzt noch ins Mantis? Oder ist das so gewollt und soll so bleiben, dann spare ich mir das mit dem Mantis.



Du musst dich registrieren um auf dieses Thema zu antworten.
Login :: » Name » Passwort

Ladezeit (sec.): 0.034 · Powered by miniBB 1.6 with parts of 1.7 © 2001-2003