% CLASSES.T /*************************************************************************************** * TURING WARS (Working Title) V 0.0.1 * * Class Declarations File * * Created By: Josh S Date: November 9, 2005 * * ICS 3M1 Turing Final Project * *************************************************************************************** * OK, so this is a first dive into a quasi object-oriented program. It just seems * * about the only way to have many (definitely upwards of 20) instances of the same * * kind of thing at one time, without some freaky variables... We did not learn * * these in ICS3M, however a valuable skill to have leaving high school is indepen- * * -dent learning. This year r eally let me see different things I thought Turing * * could never accomplish, so here we go! * ***************************************************************************************/ var verdana := Font.New ("verdana:10:bold") % -------------------------------- BEGIN UNIT DECLARATIONS ----------------------------- class Infantry import verdana export x, y, col, initialize, load var x, y, col : int := 0 proc initialize (gridX, gridY : int, teamOn : boolean) if teamOn = false then col := red else col := blue end if %drawbox (100 + (gridX * 16), 100 + (gridY * 16), 116 + (gridX * 16), 116 + (gridY * 16), col) Font.Draw ("I", 105 + (gridX * 16), 105 + (gridY * 16), verdana, col) x := gridX y := gridY end initialize proc load (unitx, unity, side : int) col := side x := x y := y Font.Draw ("I", 105 + (unitx * 16), 105 + (unity * 16), verdana, col) end load end Infantry class Tank import verdana export x, y, col, initialize, load var x, y, col : int := 0 proc initialize (gridX, gridY : int, teamOn : boolean) if teamOn = false then col := red else col := blue end if %drawfillbox (100 + (gridX * 16), 100 + (gridY * 16), 116 + (gridX * 16), 116 + (gridY * 16), col) Font.Draw ("T", 105 + (gridX * 16), 105 + (gridY * 16), verdana, col) x := gridX y := gridY end initialize proc load (unitx, unity, side : int) col := side x := x y := y Font.Draw ("T", 105 + (unitx * 16), 105 + (unity * 16), verdana, col) end load end Tank class Artillery import verdana export x, y, col, initialize, load var x, y, col : int := 0 proc initialize (gridX, gridY : int, teamOn : boolean) if teamOn = false then col := red else col := blue end if %drawfillbox (100 + (gridX * 16), 100 + (gridY * 16), 116 + (gridX * 16), 116 + (gridY * 16), col) Font.Draw ("A", 105 + (gridX * 16), 105 + (gridY * 16), verdana, col) x := gridX y := gridY end initialize proc load (unitx, unity, side : int) col := side x := x y := y Font.Draw ("A", 105 + (unitx * 16), 105 + (unity * 16), verdana, col) end load end Artillery % -------------- TURING WARS.T View.Set ("graphics:max,max") include "classes.t" % Declare the terrain constants const CITY := 1 const GRASS := 2 const FOREST := 3 const MOUNTAIN := 4 const ROAD := 5 const SHALLOW := 6 const WATER := 7 const SHORE := 8 var terrainTypes : array 1 .. 8 of int := init (42, 48, 2, 66, 15, 53, 55, 91) var units : array 1 .. 100, 1 .. 100 of string % The array which stores where all the units are var infantry : array 1 .. 100 of pointer to Infantry var tank : array 1 .. 100 of pointer to Tank var artillery : array 1 .. 100 of pointer to Artillery var unitToAdd, infCount, tankCount, artyCount : int := 1 var map : array 1 .. 100, 1 .. 100 of int var mx, my, mb, terrType : int := 1 var teamOn : boolean := false % Initialize the Unit Classes -> Josh for i : 1 .. 100 new Infantry, infantry (i) new Tank, tank (i) new Artillery, artillery (i) end for % ********************* COMMON PROCEDURES AND FUNCTIONS ************************* var addTerr : boolean := false function pixToGridX (mx : int) : int % -> The next 4 were done by both result (mx - 100) div 16 end pixToGridX function pixToGridY (my : int) : int result (my - 100) div 16 end pixToGridY function gridToPixX (gridX : int) : int result 100 + gridX * 16 end gridToPixX function gridToPixY (gridY : int) : int result 100 + gridY * 16 end gridToPixY function findSpaceInString (word : string) : int % -> Josh for i : 1 .. length (word) if word (i) = " " then result i end if end for result 0 end findSpaceInString function isPassable (gridX, gridY : int) : boolean var terrtype : int terrtype := map (gridX, gridY) if terrtype = SHALLOW or terrtype = WATER then result false else result true end if end isPassable proc updateTile (tileX, tileY, terrType : int) % -> Josh drawfillbox (100 + tileX * 16, 100 + tileY * 16, 116 + tileX * 16, 116 + tileY * 16, terrainTypes (map (tileX, tileY))) end updateTile proc initializeMap % -> Josh for i : 1 .. 100 for j : 1 .. 100 map (i, j) := 2 units (i, j) := "" end for end for end initializeMap proc drawMap % -> Josh for i : 1 .. 40 for j : 1 .. 40 drawfillbox (100 + i * 16, 100 + j * 16, 100 + i * 16 + 16, 100 + j * 16 + 16, terrainTypes (map (i, j))) end for end for end drawMap % ********************* MAP EDITOR PROCEDURES AND FUNCTIONS ************************* proc initializeEditor % The Save Button drawbox (50, 250, 100, 275, black) drawfill (51, 251, red, black) Font.Draw ("SAVE", 58, 258, verdana, white) % The Load Button drawbox (50, 280, 100, 305, black) drawfill (51, 281, red, black) Font.Draw ("LOAD", 58, 288, verdana, white) var unitnames : array 1 .. 3 of string := init ("Inf.", "Tank", "Art.") Draw.Text ("Units", 125, 90, verdana, black) drawbox (65, 75, 95, 100, black) drawfill (66, 76, red, black) drawbox (65, 30, 95, 55, black) drawfill (66, 31, blue, black) if teamOn = false then drawbox (64, 29, 96, 56, white) drawbox (64, 74, 96, 101, green) else drawbox (64, 73, 96, 101, white) drawbox (64, 29, 96, 56, green) end if for u : 1 .. 3 drawbox (130 + (u * 35), 55, 155 + (u * 35), 80, black) Draw.Text (unitnames (u), 130 + (u * 35), 40, verdana, black) end for % This first bit was done by Mike. Following done by Josh, with help from Mike for i : 1 .. 2 for j : 1 .. 4 if i = 1 then drawfillbox (25 + (i * 25), 100 + (j * 25), 50 + (i * 25), 125 + (j * 25), terrainTypes (j)) else drawfillbox (25 + (i * 25), 100 + (j * 25), 50 + (i * 25), 125 + (j * 25), terrainTypes (4 + j)) end if end for end for end initializeEditor proc changeTerrType (mx, my, terrType : int) map (pixToGridX (mx), pixToGridY (my)) := terrType end changeTerrType proc saveMap var filename : string := "" var output : int locate (1, 1) put "Enter a name: " .. get filename open : output, "maps\\" + filename + ".map", put for i : 1 .. 40 for j : 1 .. 40 put : output, map (i, j), " " .. end for end for for i : 1 .. 20 if infantry (i) -> x > 0 then put : output, "i", infantry (i) -> col, " ", infantry (i) -> x, " ", infantry (i) -> y end if if tank (i) -> x > 0 then put : output, "t", tank (i) -> col, " ", tank (i) -> x, " ", tank (i) -> y end if if artillery (i) -> x > 0 then put : output, "a", artillery (i) -> col, " ", artillery (i) -> x, " ", artillery (i) -> y end if end for close : output locate (1, 1) put "Map Saving Completed." end saveMap proc loadMap var filename : string := "" var input : int var Char : string (1) var character : string var temp, temp2, unitX, unitY, side : int := 0 locate (1, 1) put "Enter a name: " .. get filename open : input, "maps\\" + filename + ".map", get if Error.Last = eNoError then for i : 1 .. 40 for j : 1 .. 40 get : input, Char if strintok (Char) = false and Char not= " " then put "Data file corrupted! Tile (", i, ",", j, ") returned to Default Type" elsif strintok (Char) then map (i, j) := strint (Char) end if end for end for drawMap loop exit when eof (input) get : input, character : * if length (character) > 6 then % Evil little region of code, took me 20min! side := strint (character (2)) temp := findSpaceInString (character) temp2 := temp + findSpaceInString (character (temp + 1 .. *)) unitX := strint (character (temp + 1 .. temp2 - 1)) unitY := strint (character (temp2 + 1 .. *)) end if if character (1) = "i" then infantry (infCount) -> load (unitX, unitY, side) infCount += 1 elsif character (1) = "t" then tank (tankCount) -> load (unitX, unitY, side) tankCount += 1 elsif character (1) = "a" then artillery (artyCount) -> load (unitX, unitY, side) artyCount += 1 end if end loop close : input else locate (1, 1) put "File not Found." end if end loadMap proc mapEditor % Created by both initializeMap initializeEditor drawMap loop mousewhere (mx, my, mb) locate (1, 1) put mx, " ", my .. locate (2, 1) if teamOn = false then put "RED TEAM (Human)" .. else put "BLUE TEAM (Computer)" .. end if if mx >= 65 and mx <= 95 then if my >= 75 and my <= 100 and mb = 1 then teamOn := false elsif my >= 30 and my <= 55 and mb = 1 then teamOn := true end if end if % Choose units to add if my > 54 and my < 80 and mb = 1 then if mx > 165 and mx < 190 then unitToAdd := 1 addTerr := false elsif mx > 200 and mx < 225 then unitToAdd := 2 addTerr := false elsif mx > 235 and mx < 260 then unitToAdd := 3 addTerr := false end if end if % Add New Units to the Map if mx > 116 and my > 115 and mx < 758 and my < 756 and mb = 1 and length (units (pixToGridX (mx), pixToGridY (my))) = 0 and isPassable (pixToGridX (mx), pixToGridY (my)) and addTerr = false then if unitToAdd = 1 then new Infantry, infantry (infCount) infantry (infCount) -> initialize (pixToGridX (mx), pixToGridY (my), teamOn) units (pixToGridX (mx), pixToGridY (my)) := "i" + intstr (infCount) infCount += 1 delay (50) elsif unitToAdd = 2 then new Tank, tank (tankCount) tank (tankCount) -> initialize (pixToGridX (mx), pixToGridY (my), teamOn) units (pixToGridX (mx), pixToGridY (my)) := "t" + intstr (tankCount) tankCount += 1 delay (50) elsif unitToAdd = 3 then new Artillery, artillery (artyCount) artillery (artyCount) -> initialize (pixToGridX (mx), pixToGridY (my), teamOn) units (pixToGridX (mx), pixToGridY (my)) := "a" + intstr (artyCount) artyCount += 1 delay (50) end if end if % Choose the terrain type to add if mx > 50 and my > 125 and mx < 100 and my < 225 and mb = 1 then if mx < 75 then terrType := 1 + (my - 125) div 25 addTerr := true else terrType := 5 + ((my - 125) div 25) addTerr := true end if end if if mx > 116 and my > 115 and mx < 758 and my < 756 and mb = 1 and addTerr = true then changeTerrType (mx, my, terrType) updateTile (pixToGridX (mx), pixToGridY (my), map (pixToGridX (mx), pixToGridY (my))) end if if mx > 50 and my > 250 and mx < 100 and my < 275 and mb = 1 then saveMap elsif mx > 50 and my > 280 and mx < 100 and my < 305 and mb = 1 then loadMap end if % Update display if addTerr = false then if unitToAdd = 1 then put "INFANTRY " .. elsif unitToAdd = 2 then put "TANKS " .. elsif unitToAdd = 3 then put "ARTILLERY " .. end if elsif addTerr = true then if terrType = 1 then put "CITY " .. elsif terrType = 2 then put "GRASS " .. elsif terrType = 3 then put "FOREST " .. elsif terrType = 4 then put "MOUNTAIN " .. elsif terrType = 5 then put "ROAD " .. elsif terrType = 6 then put "SHALLOWS " .. elsif terrType = 7 then put "WATER " .. elsif terrType = 8 then put "SAND " .. end if end if end loop end mapEditor mapEditor % BEACHHEAD MAP (FOR TESTING) 4 4 4 4 4 4 4 4 4 4 4 3 3 2 2 2 5 2 2 2 2 2 2 3 3 4 3 4 4 4 4 4 4 4 4 4 4 2 2 2 4 4 4 4 4 4 4 4 4 4 3 3 3 2 2 2 5 2 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 4 4 2 2 2 4 4 4 4 4 4 4 4 3 3 3 3 2 2 2 5 5 2 2 2 2 3 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 2 2 2 2 4 4 4 4 4 4 3 3 3 3 2 2 2 2 5 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 2 2 2 2 3 4 4 4 3 3 3 3 3 2 2 2 2 5 5 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 2 2 2 2 2 3 3 3 3 3 3 3 2 2 2 2 2 5 2 2 2 2 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 4 4 4 2 2 2 2 2 3 3 3 3 3 2 2 2 2 2 2 5 5 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 3 3 3 2 2 2 3 3 2 5 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 5 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 3 2 2 2 3 3 3 3 2 5 2 3 3 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 2 2 5 2 3 3 4 4 3 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 5 5 2 2 2 2 2 2 2 2 2 2 2 5 2 3 3 3 3 3 3 3 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5 5 2 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 2 3 3 3 3 3 3 2 2 2 2 2 2 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 5 5 2 2 2 2 2 2 2 2 2 2 2 3 4 4 3 3 3 2 2 2 2 2 2 2 2 2 4 4 4 4 4 2 2 2 2 2 2 2 2 5 5 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 2 4 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 3 2 2 5 5 2 2 2 2 2 3 2 2 3 3 3 2 3 3 2 3 3 4 2 2 2 2 2 2 2 2 3 3 3 3 3 2 2 2 2 2 2 2 2 5 2 2 2 3 3 3 2 2 3 3 2 2 2 2 2 2 2 2 4 2 2 2 2 2 2 2 3 3 3 3 3 3 3 2 2 2 2 2 2 5 5 2 2 2 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 3 3 3 3 2 2 2 2 2 2 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 8 8 2 2 2 2 4 4 4 3 3 2 2 2 2 2 2 5 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 8 8 8 2 2 2 2 2 2 2 3 3 2 4 2 2 2 2 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 8 8 8 2 2 2 2 2 2 2 2 2 2 4 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5 5 5 2 2 2 2 2 2 2 2 6 6 8 8 8 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 2 2 2 3 2 2 2 2 6 6 6 8 8 8 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 5 2 2 2 2 2 2 2 2 7 6 6 6 8 8 8 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 2 2 2 2 2 2 2 2 7 7 6 6 6 8 8 8 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 7 7 7 6 6 6 8 8 8 2 2 2 8 8 2 8 8 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 7 7 7 7 6 6 6 8 8 8 2 8 8 8 8 8 8 8 2 8 8 8 8 8 8 2 8 8 8 8 8 2 2 2 2 2 2 2 2 8 7 7 7 7 6 6 6 8 8 8 2 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 2 8 8 8 2 2 2 2 7 7 7 7 7 6 6 6 6 8 8 8 8 8 8 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 2 2 2 7 7 7 7 7 7 6 6 6 8 8 8 6 8 6 6 8 8 8 6 6 6 8 8 6 8 8 8 8 6 8 8 8 8 8 8 8 2 2 2 7 7 7 7 7 7 6 6 6 6 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 8 6 6 6 6 8 8 6 6 6 6 2 2 2 7 7 7 7 7 7 7 6 6 6 6 6 6 6 7 7 6 6 6 6 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 7 7 7 6 6 7 7 7 7 6 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 2 2 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 2 2 2