{**************************************************************************** Jyväskylän Yliopisto Tietotekniikan laitos GKOSyksy1999Harjoitustyö MachoMyyrä ja Taistelu Silakkka VIII ------------------------------------- tilanne.pas pitää yllä tilannetta alustaa tai lataa tilanteen Tarvittavat tiedostot: tilanne.pas version : 0.1 by : Sami Manninen date : 20.11.1999 comments: -perus tilanne kaikkiin peliin version: 0.2 by : Saku Kukonlehto changed: 25.11.1999 comments: -lisätty tiedoston luku ja kirjoitus -lisätyt metodit: destructor Destroy, procedure LataaTiedot procedure AsetaTiedot, procedure Avaus procedure TaulKasittely, procedure OletusArvot procedure AsetaTiedostonNimi, procedure TalletaTiedot property tiedostonNimi, property Tunniste version: 0.3 by : Saku Kukonlehto changed: 27.11.1999 comments: -laitettu talletus toimimaan paremmin eli jos puuttuu alihakemisto se tehdään ja käyttäjän tarvitsee ainoastaan kirjoittaa ruutuun aloitus. -tietojen talletus tapahtuu ainoastaan kutsumalla metodia: procedure TalletaTiedot -lisätty opendialog boxi ja savedialog boxi ja attribuuttu TiedOlemassa, joka kertoo onko tiedostoa aloitus.sav olemassa oikeassa paikassa. version : 0.4 by : Sami Manninen changed: 28.11.1999 comments: -lisätyt attribuuttine saanti ja asetus metodit -kaikki attribuutit muutettu stringeiksi talletuksen yksinkertaistami- seksi. -lisätty metodit attribuuttien kasvattamiseksi halutulla arvolla int. version: 0.5 by : Saku Kukonlehto changed: 28.11.1999 comments: -tehty virtuaalinen metodi, jolla voidaan tallettaa halutut tiedot -lisätyt attribuutit: Alihakemisto, attr joka kertoo tämän luokan koon -Metodi jolla voidaan tallettaa näiden lisäksi muitakin tietoja samaan tiedostoon Talleta(Tiedot:array of String); Tiedot ovat muotoa eli '100' integer aikaisemmin. -Lataaminen tapahtuu automaattisesti eli omat attribuutit ladataan pai- koillensa ja muut tiedot taulukkoon MuutTalletet. -lisätty property millä kerrotaan muiden talletettavien tietojan lkm *******************************************************************************} unit Tilanne; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, extctrls; type Taulu = array of String; type TTilanne = class(TPanel) private FTiedostonNimi: string; FTunniste : string; Stiedot : array of ^String; F : TextFile; Open : TOpenDialog; Save : TSaveDialog; TiedOlemassa : Boolean; Alihakemisto : String; AttrLkm : integer; MuutTalletet : Taulu; FMuidenTalLkm : integer; JuuriHakemisto: string; FPisteet : String; FElamalaivat : String; FLeveli : String; FPelaaja : String; procedure AsetaElamalaivat(ElamaLaivat : String); procedure AsetaLeveli (Leveli : String); procedure AsetaPelaaja (Pelaaja : String); procedure AsetaPisteet (Pisteet : String); protected procedure AsetaTiedot; virtual; procedure Avaus; virtual; procedure TaulKasittely(tapa:string); virtual; procedure OletusArvot; virtual; procedure AsetaTiedostonNimi(const Nimi:string);virtual; public constructor Create (AOwner:TComponent); overload; override; constructor Create (AOwner:TComponent;nimi: String);reintroduce; overload; destructor Destroy; override; procedure TalletaTiedot; virtual; procedure LataaTiedot; virtual; procedure LataaUudetTiedot; virtual; function AnnaPisteet : String; virtual; function AnnaElamalaivat : string; virtual; function AnnaLeveli : string; virtual; function AnnaPelaaja : String; virtual; procedure KasvataLeveli; virtual; procedure KasvataElamalaivat; virtual; procedure KasvataPisteet(Arvo:integer); virtual; procedure VahennaElamalaivat; virtual; function GetTiedot : Taulu; virtual; procedure Talleta(tiedot:Taulu); virtual; published property Pisteet :String read FPisteet write AsetaPisteet; property Elamalaivat :String read FElamalaivat write AsetaElamalaivat; property Leveli :String read FLeveli write AsetaLeveli; property Pelaaja :String read FPelaaja write AsetaPelaaja; property TiedostonNimi:string read FTiedostonNimi write AsetaTiedostonNimi; property Tunniste :string read FTunniste write FTunniste; property MuidenTalLkm :integer read FMuidenTalLkm Write FMuidenTalLkm; end; procedure Register; implementation {ladataan vanhasta tiedostosta arvot paikoilleen} constructor TTilanne.Create(AOwner: TComponent); begin inherited Create(AOwner); OletusArvot; LataaTiedot; end; {uusi peli oletus arvoilla, jotka ovat tiedostossa aloitus.sav} constructor TTilanne.Create(AOwner: TComponent; nimi: String); begin inherited Create(AOwner); OletusArvot; LataaUudetTiedot; Pelaaja := nimi; end; {attribuuttien saantimetodit} function TTilanne.AnnaElamalaivat: String; begin Result := Elamalaivat; end; function TTilanne.AnnaLeveli: String; begin Result := Leveli; end; function TTilanne.AnnaPelaaja: String; begin Result := Pelaaja; end; function TTilanne.AnnaPisteet: String; begin Result := Pisteet; end; {metodit attribuuttien asettamiseksi} procedure TTilanne.AsetaElamalaivat(ElamaLaivat : String); begin FElamalaivat:= Elamalaivat; end; procedure TTilanne.AsetaPisteet(Pisteet : String); begin FPisteet := Pisteet; end; procedure TTilanne.AsetaPelaaja(Pelaaja : String); begin FPelaaja:= Pelaaja; end; procedure TTilanne.AsetaLeveli(Leveli : String); begin FLeveli:= Leveli; end; {taulukoihin lisätään tarvittavat attribuutit, joita halutaan lukea ja tallettaa} procedure TTilanne.AsetaTiedot; var I, J:integer; begin AttrLkm := 4; setLength(Stiedot, (AttrLkm + MuidenTalLkm)); SetLength(MuutTalletet, MuidenTalLkm); Stiedot[0] := addr(Pelaaja); Stiedot[1] := addr(Pisteet); Stiedot[2] := addr(Elamalaivat); Stiedot[3] := addr(Leveli); {laitetaan Stiedot taulukko osoittamaan MuutTalletetut taulukon indekseihin, että saadaan luettua myös muut kuin attribuuttien tiedot tiedostosta} J := 0; for I := AttrLkm to AttrLkm + High(MuutTalletet) do begin Stiedot[I] := Addr(MuutTalletet[J]); Inc(J); end; end; {****************************************************************************** Tiedostojen käsittelyyn tarvittavat metodit *******************************************************************************} {virtuaalinen metodi, jolla voidaan omien attribuuttien lisäksi tallettaa MuutTalletet taulukon alkiot, laittamalla niiden osoittimet Stiedot taulukkoon} procedure TTilanne.Talleta(Tiedot:Taulu); var apu,I, J : integer; begin SetLength(MuutTalletet, High(Tiedot) + 1); for J := 0 to High(Tiedot) do begin MuutTalletet[J] := Tiedot[J]; end; apu := High(Tiedot); setLength(Stiedot, (AttrLkm + apu + 1)); J := 0; for I := AttrLkm to AttrLkm + apu do begin Stiedot[I] := addr(MuutTalletet[J]); Inc(J); end; TalletaTiedot; end; {tiedoston avaus} procedure TTilanne.Avaus; begin AssignFile(F,FTiedostonNimi); end; destructor TTilanne.Destroy; begin Open.Free; STiedot:=nil; save.Free; ChDir(JuuriHakemisto); inherited; end; procedure TTilanne.LataaUudetTiedot; begin if TiedOlemassa = False then exit; Avaus; reset(F); TaulKasittely('load'); CloseFile(F); end; {metodi joka aukaisee avaus ikkunan, josta voi valita haluamansa tiedoston} procedure TTilanne.LataaTiedot; begin if TiedOlemassa = False then exit; Open := TOpenDialog.Create(self); Open.InitialDir := '.\' + Alihakemisto + '\'; Open.Options := [ofAllowMultiSelect, ofFileMustExist]; Open.Filter := 'Saved files (*.sav)|*.sav|All files (*.*)|*.*'; Open.FilterIndex := 0; Open.Execute; ChDir(JuuriHakemisto); FTiedostonNimi := Open.filename; LataaUudetTiedot; end; {metodi joka aukaisee talletus ikkunan, josta voi valita haluamansa tiedoston nimen tai kirjoittaa uuden} procedure TTilanne.TalletaTiedot; begin save.InitialDir := '.\' + Alihakemisto + '\'; save.Options := [ofAllowMultiSelect, ofFileMustExist]; save.Filter := 'Saved files (*.sav)|*.sav|All files (*.*)|*.*'; save.FilterIndex := 0; save.Execute; ChDir(JuuriHakemisto); FTiedostonNimi := save.filename+tunniste; Avaus; rewrite(F); TaulKasittely('save'); closefile(F); end; {varsinainen metodi joka lukee tai kirjoittaa tiedostoon ja sijoittaa sitten ne Stiedot osoitin taulukon osoittamiin paikkoihin} procedure TTilanne.TaulKasittely(tapa: string); var I:integer; begin for I:=0 to high(Stiedot) do begin if tapa = 'load' then readln(F, STiedot[I]^) else writeln(F, Stiedot[I]^); end; end; procedure TTilanne.OletusArvot; begin Align := alRight; Visible := False; JuuriHakemisto := GetCurrentDir; save := TSaveDialog.Create(self); MuidenTalLkm := 5; Alihakemisto := 'Talletuksia'; Tunniste := '.sav'; Pelaaja := 'aloitus'; Pisteet := '0' ; Leveli := '1' ; Elamalaivat := '10' ; TiedOlemassa := True; AsetaTiedot; TiedostonNimi := '.\' + Alihakemisto + '\' + Pelaaja + Tunniste; end; {asettaa tiedoston nimen ja tarkastaa onko alihakemistoa ja tarvittavaa tiedostoa aloitus.sav olemassa vai pitääkö tehdä uusi} procedure TTilanne.AsetaTiedostonNimi(const nimi:string); var buffer: array [0..255] of char; FileToFind: string; begin GetWindowsDirectory(buffer, SizeOf(buffer)); FileToFind := FileSearch( nimi , GetCurrentDir + ';' + buffer); if FileToFind = '' then begin ShowMessage('Ohjelmalta Puuttuu alihakemisto('+Alihakemisto+'), jossa pitää olla tiedosto aloitus.sav'); MkDir(Alihakemisto); TalletaTiedot; TiedOlemassa := False; end; FTiedostonNimi := nimi ; end; {attribuuttien käsittelyyn liittyvät kasvatus ja vähennys metodit} procedure TTilanne.KasvataElamalaivat; var Apu:integer; begin Apu:=(StrToInt(Elamalaivat)); Inc(Apu); Elamalaivat:= IntToStr(Apu); end; procedure TTilanne.KasvataLeveli; var Apu:integer; begin Apu:=(StrToInt(Leveli)); Inc(Apu); Leveli:=IntToStr(Apu); end; procedure TTilanne.KasvataPisteet(Arvo:integer); begin Pisteet := IntToStr(StrToInt(Pisteet) + Arvo); end; procedure TTilanne.VahennaElamalaivat; var Apu:integer; begin Apu:=(StrToInt(Elamalaivat)); Inc(Apu,-1); Elamalaivat:=IntToStr(Apu); end; function TTilanne.GetTiedot: Taulu; begin result := MuutTalletet; end; procedure Register; begin RegisterComponents('Silli', [TTilanne]); end; end.