|
|
- ' ***************
- ' * T R A D E R *
- ' * v1.0 *
- ' ***************
- '
- ' Copyright 1997 Brennen Bearnes
-
- ' This is an attempted clone of an old Apple II game called Taipan, in which
- ' you sailed around, traded in stuff, and battled pirates. Copy and
- ' distribute as you like, provided you distribute the original unmodified
- ' archive (trader.zip).
-
- ' NOTES:
- ' I started this for the last Retro Compo on comp.lang.basic.misc (which got
- ' something like 3 entries), and it's been sitting there unfinished for
- ' months. There's quite a bit of stuff I'd like to add, but I figured I
- ' ought to release what I have. Below is a list of things I'd like to
- ' complete for version 2.0.
-
- ' Stuff that needs done:
- ' - A story (sort of have one worked out)
- ' - More enemies
- ' - Cannon and armor upgrades, etc.
- ' - More locations within cities
- ' - More/better graphics
- ' - End game animations
-
- ' The graphics (such as they are), were done with Lior Zur's excellent QBdraw.
- ' It can be found at:
- ' http://www.geocities.com/SiliconValley/Heights/9246/
-
- ' Comments/ideas/suggestions are, as always, welcome.
-
- ' --
- ' Brennen Bearnes | bbearnes@hardlink.com
- ' http://www.hardlink.com/~bbearnes/
-
- ' ********
- ' * SUBs *
- ' ********
-
- DECLARE SUB AddCargo (d%, Item$, AddToPlace%)
- DECLARE SUB BankMenu ()
- DECLARE SUB BlockPrint (StartY%, StartX%, EndY%, EndX%, ReplaceChar$)
- DECLARE SUB Events (d%)
- DECLARE SUB FLoad (FileOffset&, DataLength&, Pic1%())
- DECLARE SUB FireCannon (startShotX!, startShotY!, shotSpeed!, shotAngle!, FireType, sX, psX)
- DECLARE SUB GameOver (OverType%)
- DECLARE SUB IconLoad (LoadIcon%, LIType%)
- DECLARE SUB IconPut (IconPutX%, IconPutY%, IconPut$)
- DECLARE SUB MainMenu ()
- DECLARE SUB MarketMenu ()
- DECLARE SUB PalLoad (PalFile$)
- DECLARE SUB Pause (delay!)
- DECLARE SUB ReadIcon ()
- DECLARE SUB SeaBattle (PType%, PGuns%)
- DECLARE SUB SetPrices (d%)
- DECLARE SUB ShipMenu ()
- DECLARE SUB WarehouseMenu ()
-
- ' *************
- ' * FUNCTIONs *
- ' *************
-
- DECLARE FUNCTION BuyPrice% (Item$)
- DECLARE FUNCTION GetKey$ ()
- DECLARE FUNCTION OpenMix1! (FileName$)
- DECLARE FUNCTION SellPrice% (Item$)
- DECLARE FUNCTION ShipFree% ()
- DECLARE FUNCTION WareFree% ()
-
- ' *********
- ' * TYPEs *
- ' *********
-
- TYPE World
- paidPirates AS INTEGER
- gameDate AS INTEGER
- END TYPE
-
- TYPE Storage
- capacity AS INTEGER
- cannon AS INTEGER
- wheat AS INTEGER
- ore AS INTEGER
- luxuries AS INTEGER
- contraband AS INTEGER
- equipment AS INTEGER
- damage AS INTEGER
- END TYPE
-
- TYPE CityType
- CName AS STRING * 11
- CType AS STRING * 3
- Hidden AS INTEGER
- END TYPE
-
- TYPE PalType
- r AS INTEGER
- g AS INTEGER
- B AS INTEGER
- END TYPE
-
- ' *************
- ' * Variables *
- ' *************
-
- 'The default text color.
- DIM SHARED TextCol%
- TextCol% = 4
-
- 'World data. Basically, all the misc. stuff that's going on in the game.
- DIM SHARED GameState AS World
-
- 'Holds data for the cities you can travel to.
- DIM SHARED Ports(8) AS CityType
-
- 'Storage variables.
- DIM SHARED WareHouse AS Storage
- DIM SHARED Ship AS Storage
- DIM SHARED CurrentPrices AS Storage
-
- 'Misc. stuff.
- DIM SHARED Credits!, City%, Bank!
- DIM SHARED PName$
-
- 'QBdraw MIX loader variables.
- CONST MaxMIX = 30 'Max files in a MIX file.
- DIM SHARED DimSize AS INTEGER
- DIM SHARED pall(256) AS PalType
- DIM SHARED pal(768)
- DIM SHARED FileSizer AS INTEGER 'The file's number of bytes counter.
- DIM SHARED FilesNumber AS INTEGER 'number of picture files in the MIX
- DIM SHARED ArraySize(MaxMIX) AS INTEGER 'array size of each file
- DIM SHARED StartRead(MaxMIX) AS INTEGER 'start reading place
-
- 'For the cannon ball drawing code.
- CONST PI = 3.141592654#
-
- SCREEN 13
-
- PalLoad "draw" 'load palette
-
- CLOSE
- N = OpenMix1("icon") 'open the MIX file and get variables.
-
- IF N = 0 THEN 'if no errors
- DIM SHARED ShipIcon%(ArraySize(1))
- DIM SHARED PirateIcon%(ArraySize(2))
- DIM SHARED cannon%(ArraySize(3))
- DIM SHARED IndIcon%(ArraySize(4))
- DIM SHARED AgrIcon%(ArraySize(5))
- DIM SHARED MinIcon%(ArraySize(6))
- DIM SHARED FunIcon%(ArraySize(7))
- DIM SHARED Splash%(ArraySize(8))
- DIM SHARED Cancel%(ArraySize(9))
- DIM SHARED TavernSign%(ArraySize(10))
- DIM SHARED WareHouseIcon%(ArraySize(11))
- DIM SHARED BankSign%(ArraySize(12))
-
- FOR LoadIcon% = 1 TO 12
- IconLoad LoadIcon%, 1
- NEXT LoadIcon%
-
- END IF
- CLOSE
-
- 'Load larger graphics. (just 4, so far.)
- N = OpenMix1("bigpics") 'open the MIX file and get variables.
-
- IF N = 0 THEN 'if no errors
- DIM SHARED BigShipPic%(ArraySize(1))
- DIM SHARED PirateShipPic%(ArraySize(2))
- DIM SHARED StormPic%(ArraySize(3))
- DIM SHARED PatrolShipPic%(ArraySize(4))
-
- FOR LoadIcon% = 1 TO 4
- IconLoad LoadIcon%, 2
- NEXT LoadIcon%
-
- END IF
- CLOSE
-
- 'The main game menu.
- MainMenu
-
- 'Starting stuff. How much your warehouse/ship can hold, what stuff you start
- 'out with, what things cost at the beginning.
- WareHouse.capacity = 1000
- Ship.damage = 100
- Ship.capacity = 100
- Ship.cannon = 3
- Ship.ore = 5
- Credits! = 50
-
- CurrentPrices.wheat = 4
- CurrentPrices.ore = 45
- CurrentPrices.luxuries = 30
- CurrentPrices.contraband = 150
- CurrentPrices.equipment = 1000
-
- 'Set the date to -1 so that you start out in January.
- GameState.gameDate = -1
-
- 'Read the cities. First is always "home base".
- FOR LoadCity% = 1 TO 8
- READ Ports(LoadCity%).CName
- READ Ports(LoadCity%).CType
- NEXT LoadCity%
-
- City% = 1
-
- CLS
-
- ' *******************
- ' * Main game loop. *
- ' *******************
-
- CityMenu:
- CLS
-
- 'PUT the city icon
- IconPut 10, 10, Ports(City%).CType
-
- LINE (5, 5)-(315, 195), 5, B
-
- LOCATE 4, 6: PRINT "You are in the city of "; Ports(City%).CName
- LOCATE 7, 3: PRINT "Where do you want to go?"
- IconPut 20, 68, Ports(City%).CType
- LOCATE 11, 7: PRINT "1. The Marketplace"
- IconPut 20, 92, "ship"
- LOCATE 14, 7: PRINT "2. Your Ship"
-
- IF City% = 1 THEN
- IconPut 20, 116, "warehouse"
- LOCATE 17, 7: PRINT "3. Your Warehouse"
- IconPut 20, 140, "banksign"
- LOCATE 20, 7: PRINT "4. The Bank"
- END IF
-
- SELECT CASE UCASE$(GetKey$)
- CASE "1"
- MarketMenu
- CASE "2"
- ShipMenu
- CASE "3"
- IF City% = 1 THEN
- WarehouseMenu
- ELSE
- GOSUB CityMenu
- END IF
- CASE "4"
- IF City% = 1 THEN
- BankMenu
- ELSE
- GOSUB CityMenu
- END IF
- CASE CHR$(27)
- LOCATE 22, 4: PRINT "Do you want to quit?"
- SELECT CASE UCASE$(GetKey$)
- CASE "Y"
- LOCATE 22, 25: PRINT "Y"
- Pause 1
- END
- CASE ELSE
- GOSUB CityMenu
- END SELECT
- END SELECT
-
- GOSUB CityMenu
-
- ' ********
- ' * DATA *
- ' ********
-
- 'city data
- 'Format: Name, type
- 'Agr is Agricultural
- 'Min is Mining
- 'Ind is industrial, or manufacturing.
- 'Fun is a pleasure city or resort.
-
- DATA "Smogville", "Ind"
- DATA "Cowstown", "Agr"
- DATA "Millwater", "Ind"
- DATA "Rockton", "Min"
- DATA "Grainville", "Agr"
- DATA "Silvercreek", "Min"
- DATA "Coalburgh", "Ind"
- DATA "Utopia", "Fun"
-
- SUB AddCargo (d%, Item$, AddToPlace%)
-
- SELECT CASE AddToPlace%
- CASE 1
- SELECT CASE Item$
- CASE "cannon"
- Ship.cannon = Ship.cannon + d%
- CASE "wheat"
- Ship.wheat = Ship.wheat + d%
- CASE "ore"
- Ship.ore = Ship.ore + d%
- CASE "luxuries"
- Ship.luxuries = Ship.luxuries + d%
- CASE "contraband"
- Ship.contraband = Ship.contraband + d%
- CASE "equipment"
- Ship.equipment = Ship.equipment + d%
- END SELECT
- CASE 2
- SELECT CASE Item$
- CASE "cannon"
- WareHouse.cannon = WareHouse.cannon + d%
- CASE "wheat"
- WareHouse.wheat = WareHouse.wheat + d%
- CASE "ore"
- WareHouse.ore = WareHouse.ore + d%
- CASE "luxuries"
- WareHouse.luxuries = WareHouse.luxuries + d%
- CASE "contraband"
- WareHouse.contraband = WareHouse.contraband + d%
- CASE "equipment"
- WareHouse.equipment = WareHouse.equipment + d%
- END SELECT
- END SELECT
- END SUB
-
- SUB BankMenu
-
- MainBank:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- IconPut 10, 10, "banksign"
- LOCATE 4, 6: PRINT "The Bank in " + Ports(City%).CName
- LOCATE 7, 3: PRINT "Your account contains"; FIX(Bank!); "Credits."
- LOCATE 8, 3: PRINT "You have "; FIX(Credits!); " Credits in Cash."
- LOCATE 10, 4: PRINT "1. Withdraw Cash"
- LOCATE 11, 4: PRINT "2. Deposit Cash"
- LOCATE 12, 4: PRINT "3. Back to Main Menu"
-
- SELECT CASE VAL(GetKey$)
- CASE 1
- LOCATE 14, 5: INPUT "Enter amount to withdraw: ", Transaction!
- IF Transaction! > Bank! THEN
- LOCATE 16, 7: PRINT "Your account isn't that big."
- WHILE INKEY$ = "": WEND
- ELSEIF Transaction! <= Bank! THEN
- Bank! = Bank! - Transaction!
- Credits! = Credits! + Transaction!
- LOCATE 16, 7: PRINT "Thanks for your business."
- WHILE INKEY$ = "": WEND
- END IF
- GOSUB MainBank
- CASE 2
- LOCATE 14, 5: INPUT "Enter amount to deposit: ", Transaction!
- IF Transaction! > Credits! THEN
- LOCATE 16, 7: PRINT "You don't have that many credits."
- WHILE INKEY$ = "": WEND
- ELSEIF Transaction! <= Credits! THEN
- Bank! = Bank! + Transaction!
- Credits! = Credits! - Transaction!
- LOCATE 16, 7: PRINT "Thanks for your business."
- WHILE INKEY$ = "": WEND
- END IF
- GOSUB MainBank
- CASE 3
- EXIT SUB
- CASE ELSE
- GOSUB MainBank
- END SELECT
-
- END SUB
-
- SUB BlockPrint (StartY%, StartX%, EndY%, EndX%, ReplaceChar$)
-
- 'This little sub just prints a block of the specified character at the
- 'given coordinates. I use it for clearing a section of the screen, such as
- 'a menu.
-
- FOR PrintLine% = StartY% TO EndY%
- LOCATE PrintLine%, StartX%: PRINT STRING$((EndX% - StartX%), ReplaceChar$)
- NEXT PrintLine%
-
- END SUB
-
- FUNCTION BuyPrice% (Item$)
-
- 'Returns the cost to buy cargo.
-
- SELECT CASE Ports(City%).CType
- CASE "Agr"
- SELECT CASE Item$
- CASE "cannon"
- Price% = 0
- CASE "wheat"
- Price% = CurrentPrices.wheat
- CASE "ore"
- Price% = 0
- CASE "luxuries"
- Price% = 0
- CASE "contraband"
- Price% = 0
- CASE "equipment"
- Price% = 0
- END SELECT
- CASE "Ind"
- SELECT CASE Item$
- CASE "cannon"
- Price% = 0
- CASE "wheat"
- Price% = 0
- CASE "ore"
- Price% = 0
- CASE "luxuries"
- Price% = CurrentPrices.luxuries
- CASE "contraband"
- Price% = 0
- CASE "equipment"
- Price% = CurrentPrices.equipment
- END SELECT
- CASE "Min"
- SELECT CASE Item$
- CASE "cannon"
- Price% = 0
- CASE "wheat"
- Price% = 0
- CASE "ore"
- Price% = CurrentPrices.ore
- CASE "luxuries"
- Price% = 0
- CASE "contraband"
- Price% = 0
- CASE "equipment"
- Price% = 0
- END SELECT
- CASE "Fun"
- SELECT CASE Item$
- CASE "cannon"
- Price% = 0
- CASE "wheat"
- Price% = 0
- CASE "ore"
- Price% = 0
- CASE "luxuries"
- Price% = 0
- CASE "contraband"
- Price% = CurrentPrices.contraband
- CASE "equipment"
- Price% = 0
- END SELECT
- END SELECT
-
- BuyPrice% = Price%
-
- END FUNCTION
-
- SUB Events (d%)
-
- 'This sub does all the stuff after you complete a voyage. Interest at the
- 'bank, the date, calls SetPrices, etc.
-
- 'Increase the date. Each voyage takes one month.
- 'Yeah, I know it's unrealistic.
- GameState.gameDate = GameState.gameDate + 1
-
- Year = FIX((GameState.gameDate / 12)) + 1850
- Month = GameState.gameDate - ((Year - 1850) * 12)
- SELECT CASE Month
- CASE 0
- Month$ = "January"
- CASE 1
- Month$ = "February"
- CASE 2
- Month$ = "March"
- CASE 3
- Month$ = "April"
- CASE 4
- Month$ = "May"
- CASE 5
- Month$ = "June"
- CASE 6
- Month$ = "July"
- CASE 7
- Month$ = "August"
- CASE 8
- Month$ = "September"
- CASE 9
- Month$ = "October"
- CASE 10
- Month$ = "November"
- CASE 11
- Month$ = "December"
- END SELECT
-
- 'Calculate interest at the bank.
- Bank! = FIX(Bank! + (Bank! * .05))
-
- 'This SUB sets the prices at the marketplace.
- SetPrices d%
-
- CLS
- LINE (5, 5)-(315, 195), 5, B
- IconPut 10, 10, Ports(d%).CType
- LOCATE 4, 6: PRINT "Arriving at " + Ports(d%).CName
-
- LOCATE 7, 3: PRINT Month$; Year
-
- SELECT CASE Month$
- CASE "January"
- 'Every January, the pirate's guild demands tribute. If you pay, you won't
- 'be attacked by pirates. Much.
- GameState.paidPirates = 0
- IF Credits! > 100 AND GameState.paidPirates = 1 THEN
- Tribute% = INT(Credits! * .25)
- ELSEIF Credits! > 100 AND GameState.paidPirates = 0 THEN
- Tribute% = INT(Credits! * .5)
- ELSEIF Credits! < 100 THEN
- Tribute% = 50
- END IF
- LOCATE 9, 3: PRINT "The pirate's guild demands "; Tribute%; "in"
- LOCATE 10, 3: PRINT "tribute. Will you pay?"
- SELECT CASE UCASE$(GetKey$)
- CASE "Y"
- IF Credits! >= Tribute% THEN
- LOCATE 10, 27: PRINT "Y"
- Credits! = Credits! - Tribute%
- GameState.paidPirates = 1
- ELSE
- LOCATE 11, 3: PRINT "You can't afford to pay."
- END IF
- CASE "N"
- LOCATE 10, 27: PRINT "N"
- END SELECT
- CASE "July"
- 'The wheat harvest is in or around july, which means that wheat prices
- 'fall. They don't pick back up again for several months, which should
- 'be an easy way to turn a good profit. (Exercise left to reader.)
- LOCATE 9, 3: PRINT "The wheat harvest has been completed."
- LOCATE 10, 3: PRINT "Wheat prices are down."
- CASE "October"
- 'Wheat prices rise again.
- LOCATE 9, 3: PRINT "Wheat prices have risen somewhat."
- END SELECT
-
- WHILE INKEY$ = "": WEND
-
- END SUB
-
- SUB FireCannon (startShotX, startShotY, shotSpeed, shotAngle, FireType, sX, psX)
- 'FireType is what kind of shot it is.
- '1 = Your ship, hit
- '2 = Your ship, miss
- '3 = Pirate ship, hit
- '4 = Pirate ship, miss
- shotAngle = shotAngle / 180 * PI
- startShotXvel = COS(shotAngle) * shotSpeed
- startShotYvel = SIN(shotAngle) * shotSpeed
- t = 0
- EndShot% = 0
-
- DO
-
- FOR paws = 1 TO 900: NEXT paws
-
- CIRCLE (shotX, shotY), 1, 0
- t = t + .1
- shotX = startShotX + (startShotXvel * t)
- shotY = startShotY + ((-1 * (startShotYvel * t)) + (4.9 * t ^ 2)) * (200 / 350)
- CIRCLE (shotX, shotY), 1, 24
-
- IF FireType = 1 AND shotX >= psX THEN
- CIRCLE (shotX, shotY), 1, 0
- EndShot% = 1
- ELSEIF FireType = 2 AND shotY >= 94 THEN
- CIRCLE (shotX, shotY), 1, 0
- PUT (shotX, shotY), Splash%
- EndShot% = 1
- paws = TIMER: WHILE TIMER <= paws + .5: WEND
- PUT (shotX, shotY), Splash%
- ELSEIF FireType = 3 AND shotX <= sX + 50 THEN
- CIRCLE (shotX, shotY), 1, 0
- EndShot% = 1
- ELSEIF FireType = 4 AND shotY >= 94 THEN
- CIRCLE (shotX, shotY), 1, 0
- PUT (shotX - 5, shotY), Splash%
- EndShot% = 1
- paws = TIMER: WHILE TIMER <= paws + .5: WEND
- PUT (shotX - 5, shotY), Splash%
- END IF
- LOOP UNTIL EndShot% = 1
-
- END SUB
-
- SUB FLoad (FileOffset&, DataLength&, DestArray() AS INTEGER)
-
- '
- ' FLoad -- Quickly loads a file's contents into specified integer array.
- '
- ' --Parameters--
- ' FileName$ = The file name to load
- ' FileOffset& = The offset of the file to start loading
- ' DataLength& = The amount, in bytes, of data to load.
- ' DestArray() = The array to load all the data into.
-
- IF FileOffset& = 0 THEN FileOffset& = 1
-
- RemBytes& = DataLength&
- BufferSize% = 32766 ' The buffer size to use. If you get out of string
- ' space errors, lower it. (result : it's slower)
- BufStart% = LBOUND(DestArray) ' Lowest element number of buffer
-
- DEF SEG = VARSEG(DestArray(BufStart%)) ' The segment of the song buffer
- Ptr& = VARPTR(DestArray(BufStart%)) ' Pointer to the song buffer
-
- LeftBytes& = RemBytes& MOD BufferSize% ' The amount of left over bytes
-
-
- SEEK #1, FileOffset&
-
- IF (LeftBytes& < RemBytes&) THEN
- FOR QuickLoad% = 1 TO (DataLength& - LeftBytes&) / BufferSize%
- Buffer$ = SPACE$(BufferSize%)
- GET #1, , Buffer$
- FOR x% = 1 TO BufferSize%
- POKE Ptr&, ASC(MID$(Buffer$, x%, 1))
- Ptr& = Ptr& + 1
- NEXT
- Buffer$ = ""
- RemBytes& = RemBytes& - BufferSize%
- NEXT
- END IF
- IF (LeftBytes& > 0) THEN
- Buffer$ = SPACE$(LeftBytes&)
- GET #1, , Buffer$
- FOR x% = 1 TO LeftBytes&
- POKE Ptr&, ASC(MID$(Buffer$, x%, 1))
- Ptr& = Ptr& + 1
- NEXT
- Buffer$ = ""
- END IF
-
- DEF SEG
-
- END SUB
-
- SUB GameOver (OverType%)
-
- ' 1 - Sunk by a pirate
- ' 2 - Sunk in a storm
- ' more to come
-
- SELECT CASE OverType%
- CASE 1
- CLS
- LINE (5, 5)-(315, 195), 5, B
- LOCATE 19, 3: PRINT "Your ship has been sunk in a"
- LOCATE 20, 3: PRINT "fierce battle with pirates."
- Pause 1
- FOR MovingShip% = 50 TO 75
- WAIT &H3DA, 8
- PUT (120, (MovingShip% - 1)), BigShipPic%
- PUT (120, MovingShip%), BigShipPic%, PSET
- Pause .3
- NEXT MovingShip%
- LOCATE 22, 3: PRINT "Press a key to continue."
- SLEEP
- CASE 2
- PRINT "Your ship has been sunk in a storm."
- PRINT TAB(6); "Press a key to continue."
- SLEEP
- END SELECT
-
- 'This may be clumsy, but all this does is re-run the program, bringing you
- 'back to the main menu, which lets you start a new game, restore, etc.
- RUN "trader"
-
- END SUB
-
- FUNCTION GetKey$
-
- 'This just returns a keypress value. Used for all those menus. I think it
- 'makes things a little more efficient, anyway.
-
- k$ = ""
- WHILE k$ = "": k$ = INKEY$: WEND
-
- GetKey$ = k$
-
- END FUNCTION
-
- SUB IconLoad (LoadIcon%, LIType%)
-
- DatLen& = ArraySize(LoadIcon%) * 2 'just temporary variables
- StrRed& = StartRead(LoadIcon%) 'because of Fload.
-
- IF LIType% = 1 THEN
- SELECT CASE LoadIcon%
- CASE 1
- FLoad StrRed&, DatLen&, ShipIcon%()
- CASE 2
- FLoad StrRed&, DatLen&, PirateIcon%()
- CASE 3
- FLoad StrRed&, DatLen&, cannon%()
- CASE 4
- FLoad StrRed&, DatLen&, IndIcon%()
- CASE 5
- FLoad StrRed&, DatLen&, AgrIcon%()
- CASE 6
- FLoad StrRed&, DatLen&, MinIcon%()
- CASE 7
- FLoad StrRed&, DatLen&, FunIcon%()
- CASE 8
- FLoad StrRed&, DatLen&, Splash%()
- CASE 9
- FLoad StrRed&, DatLen&, Cancel%()
- CASE 10
- FLoad StrRed&, DatLen&, TavernSign%()
- CASE 11
- FLoad StrRed&, DatLen&, WareHouseIcon%()
- CASE 12
- FLoad StrRed&, DatLen&, BankSign%()
- END SELECT
- ELSEIF LIType% = 2 THEN
- SELECT CASE LoadIcon%
- CASE 1
- FLoad StrRed&, DatLen&, BigShipPic%()
- CASE 2
- FLoad StrRed&, DatLen&, PirateShipPic%()
- CASE 3
- FLoad StrRed&, DatLen&, StormPic%()
- END SELECT
- END IF
- END SUB
-
- SUB IconPut (IconPutX%, IconPutY%, IconPutName$)
-
- SELECT CASE IconPutName$
- CASE "Ind"
- PUT (IconPutX%, IconPutY%), IndIcon%
- CASE "Min"
- PUT (IconPutX%, IconPutY%), MinIcon%
- CASE "Agr"
- PUT (IconPutX%, IconPutY%), AgrIcon%
- CASE "Fun"
- PUT (IconPutX%, IconPutY%), FunIcon%
- CASE "warehouse"
- PUT (IconPutX%, IconPutY%), WareHouseIcon%
- CASE "banksign"
- PUT (IconPutX%, IconPutY%), BankSign%
- CASE "tavernsign"
- PUT (IconPutX%, IconPutY%), TavernSign%
- CASE "ship"
- PUT (IconPutX%, IconPutY%), ShipIcon%
- CASE "cancel"
- PUT (IconPutX%, IconPutY%), Cancel%
- END SELECT
-
- END SUB
-
- SUB MainMenu
-
- Start:
- CLS
- COLOR TextCol%
- PRINT
- PRINT TAB(13); "T R A D E R"
- PRINT
- IconPut 20, 44, "ship"
- LOCATE 8, 7: PRINT "1. New Game"
- IconPut 20, 68, "cancel"
- LOCATE 11, 7: PRINT "2. Quit"
-
- SELECT CASE VAL(GetKey$)
- CASE 1
- GOSUB StartGame
- CASE 2
- END
- CASE ELSE
- GOSUB Start
- END SELECT
-
- StartGame:
- CLS
- PRINT
- PRINT TAB(6); "What is your name, Trader?"
- LOCATE 4, 10: INPUT "]", PName$ 'Get the player's name.
-
- CLS
-
- END SUB
-
- SUB MarketMenu
- 'Buy and sell stuff, etc.
-
- MainMarket:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- 'Draw the city icon thingy.
- IconPut 10, 10, Ports(City%).CType
- LOCATE 4, 6: PRINT "The market in " + Ports(City%).CName
-
- LOCATE 7, 3: PRINT "Cargo Free"
- IF ShipFree% >= 0 THEN
- LOCATE 8, 3: PRINT USING "#### ####"; (Ship.capacity - ShipFree%); ShipFree%
- ELSEIF ShipFree% < 0 THEN
- LOCATE 8, 3: PRINT USING "#### Overloaded"; (Ship.capacity - ShipFree%)
- END IF
- LOCATE 10, 3: PRINT FIX(Credits!); "Credits"
- LOCATE 12, 3: PRINT "What do you want to do?"
- LOCATE 13, 4: PRINT "1. Sell Items"
- LOCATE 14, 4: PRINT "2. Buy Items"
- LOCATE 15, 4: PRINT "3. Back to Main Menu"
-
- SELECT CASE VAL(GetKey$)
- CASE 1
- GOSUB SellMenu
- CASE 2
- GOSUB BuyMenu
- CASE 3
- EXIT SUB
- CASE ELSE
- GOSUB MainMarket
- END SELECT
-
- SellMenu:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- LOCATE 5, 3: PRINT "What do you want to sell?"
- 'Put the city icon thingy.
- IconPut 10, 10, Ports(City%).CType
-
- LOCATE 7, 4: PRINT "Item No."
- IF Ship.cannon > 0 THEN LOCATE 9, 4: PRINT USING "(C)annon ####"; Ship.cannon
- IF Ship.wheat > 0 THEN LOCATE 10, 4: PRINT USING "(W)heat ####"; Ship.wheat
- IF Ship.ore > 0 THEN LOCATE 11, 4: PRINT USING "(O)re ####"; Ship.ore
- IF Ship.luxuries > 0 THEN LOCATE 12, 4: PRINT USING "(L)uxury Goods ####"; Ship.luxuries
- IF Ship.contraband > 0 THEN LOCATE 13, 4: PRINT USING "Con(t)raband ####"; Ship.contraband
- IF Ship.equipment > 0 THEN LOCATE 14, 4: PRINT USING "(E)quipment ####"; Ship.equipment
- LOCATE 16, 4: PRINT "(D)one"
-
- 'There has *got* to be a better way to do this...
- SELECT CASE UCASE$(GetKey$)
- CASE "C"
- NumItems% = Ship.cannon: Item$ = "cannon"
- CASE "W"
- NumItems% = Ship.wheat: Item$ = "wheat"
- CASE "O"
- NumItems% = Ship.ore: Item$ = "ore"
- CASE "L"
- NumItems% = Ship.luxuries: Item$ = "luxuries"
- CASE "T"
- NumItems% = Ship.contraband: Item$ = "contraband"
- CASE "E"
- NumItems% = Ship.equipment: Item$ = "equipment"
- CASE "D"
- GOSUB MainMarket
- CASE ELSE
- GOSUB SellMenu
- END SELECT
-
- CalcSale:
- SPrice% = SellPrice%(Item$)
- LOCATE 18, 3: PRINT "You have "; NumItems%; " Units of " + Item$
- LOCATE 19, 3: PRINT Item$ + " is/are selling for "; SPrice%
- LOCATE 20, 3: INPUT "Number to Sell: ", d%
- IF d% <= NumItems% THEN
- AddCargo -d%, Item$, 1
- Credits! = Credits! + (SPrice% * d%)
- LOCATE 20, 3: PRINT TAB(6); "Items Sold: "; d%; Item$
- ELSEIF d% > NumItems% THEN
- LOCATE 20, 3: PRINT "You don't have that many " + Item$ + "."
- END IF
-
- WHILE INKEY$ = "": WEND
- GOSUB SellMenu
-
- 'This is the menu where one buys stuff.
- BuyMenu:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- LOCATE 5, 3: PRINT USING "Free space: ####"; ShipFree%
- LOCATE 6, 3: PRINT USING "Credits: ##########"; FIX(Credits!)
- LOCATE 7, 3: PRINT "What do you want to buy?"
- 'Icon thingy again.
- IconPut 10, 10, Ports(City%).CType
-
- SELECT CASE Ports(City%).CType
- CASE "Agr"
- LOCATE 9, 4: PRINT "(W)heat"
- CASE "Ind"
- LOCATE 9, 4: PRINT "(L)uxury Goods"
- LOCATE 10, 4: PRINT "(E)quipment"
- CASE "Min"
- LOCATE 9, 4: PRINT "(O)re"
- CASE "Fun"
- LOCATE 9, 4: PRINT "Con(t)raband"
- END SELECT
- LOCATE 16, 4: PRINT "(D)one"
-
- SELECT CASE UCASE$(GetKey$)
- CASE "W"
- Item$ = "wheat"
- CASE "L"
- Item$ = "luxuries"
- CASE "E"
- Item$ = "equipment"
- CASE "O"
- Item$ = "ore"
- CASE "T"
- Item$ = "contraband"
- CASE "D"
- GOSUB MainMarket
- CASE ELSE
- GOSUB BuyMenu
- END SELECT
-
- CalcPurchase:
- BPrice% = BuyPrice%(Item$)
- IF BPrice% > 0 THEN
- LOCATE 18, 4: PRINT Item$ + " costs "; BPrice%; " per Unit."
- LOCATE 19, 4: PRINT "You can afford " + STR$(FIX(Credits! / BPrice%))
- LOCATE 20, 4: INPUT "Number to buy: ", d%
- IF (d% * BPrice%) <= Credits! THEN
- Credits! = Credits! - (d% * BPrice%)
- AddCargo d%, Item$, 1
- LOCATE 20, 4: PRINT "Number bought: "; d%
- IF ShipFree% < 0 THEN
- LOCATE 21, 4: PRINT "Your ship is overloaded."
- END IF
- ELSEIF (d% * BPrice%) > Credits! AND ShipFree% >= d% THEN
- LOCATE 20, 4: PRINT "You can't afford that many."
- END IF
- ELSEIF BPrice% = 0 THEN
- GOSUB BuyMenu
- END IF
-
- WHILE INKEY$ = "": WEND
- GOSUB BuyMenu
-
- END SUB
-
- FUNCTION OpenMix1 (FileName$)
- DIM lbyte AS STRING * 1
-
- '(5) 5 char file id -+
- ' + |
- '(4) 2 integer file version + num files |= calculate
- '==== | file header
- ' 9 _|
-
- FileSizer = 10 'this is the header size + 1 (1 = starting location)
- DIM Dummy AS INTEGER 'just for info inside file that we don't need.
- mk = FREEFILE
- OPEN FileName$ + ".MIX" FOR BINARY AS mk
- IF LOF(mk) <= 0 THEN 'file doesn't exist!
- CLOSE
- KILL FileName$ + "MIX" ' kill file! (opening file that doesn't
- ' exist creates an empty file)
- OpenMix1 = -1
- EXIT FUNCTION
- END IF
- id$ = "" 'get file id, to check if it's MIX
- FOR I = 1 TO 5 'file...
- GET #mk, , lbyte
- id$ = id$ + lbyte
- NEXT I
- IF id$ <> "QBMIX" THEN 'if it's not, EXIT!!!!
- OpenMix1 = -2
- EXIT FUNCTION
- END IF
- DIM vers AS INTEGER
- GET #mk, , vers 'get version
- IF vers <> 1 THEN 'we know how to open only version 1
- OpenMix1 = -3
- EXIT FUNCTION
- END IF
- GET #mk, , FilesNumber 'number of pictures inside MIX
- IF FilesNumber > MaxMIX OR FilesNumber <= 0 THEN
- OpenMix1 = -4 'if it's too big or too small, exit!
- EXIT FUNCTION
- END IF 'until now file header
-
- FOR I = 1 TO FilesNumber
- 'file name (8 bytes)
- FOR d = 1 TO 8 'read file name. It's not useful here, so
- GET #mk, , lbyte 'we just use a dummy.
- FileSizer = FileSizer + 1 'we read one byte at a time.
- NEXT d
- GET #mk, , ArraySize(I) 'read array size
- GET #mk, , Dummy 'read x size
- GET #mk, , Dummy 'read y size (we use a dummy)
- FileSizer = FileSizer + 6 'we read 3 integers that are 2 bytes
- NEXT I 'each.
-
- 'now we have to calculate the place of each picture
- 'inside the file
- FOR I = 1 TO FilesNumber
- StartRead(I) = FileSizer 'array place in bytes
- FileSizer = FileSizer + (ArraySize(I) * 2) 'because integer = 2
- NEXT I 'bytes
- END FUNCTION
-
- SUB PalLoad (PalFile$)
- CLOSE
- OPEN PalFile$ + ".PAL" FOR BINARY AS #1
- IF LOF(1) = 0 THEN
- CLOSE #1
- KILL PalFile$ + ".PAL"
- EXIT SUB
- END IF
- CLOSE #1
- OPEN PalFile$ + ".PAL" FOR INPUT AS #1
- FOR I = 1 TO 768
- INPUT #1, pal(I)
- NEXT I
- CLOSE #1
- num = 1
- an = 1
- DO
- pall(an).r = pal(num)
- num = num + 1
- pall(an).g = pal(num)
- num = num + 1
- pall(an).B = pal(num)
- num = num + 1
- an = an + 1
- LOOP UNTIL num > 768
- OUT &H3C7, 0: OUT &H3C8, 0
- FOR a% = 1 TO 256 * 3:
- OUT &H3C9, pal(a%)
- NEXT a%
- END SUB
-
- SUB Pause (delay!)
-
- 'This sub just delays for the specified amount of time. Found it in an ABC
- 'packet. Seems like a good method.
-
- t! = INT(TIMER)
- IF delay! >= 1 THEN
- DO
- IF t! <> INT(TIMER) THEN
- t! = INT(TIMER)
- count = count + 1
- END IF
- LOOP UNTIL count = delay!
- ELSEIF delay! < 1 THEN
- DO
- IF t! <> TIMER THEN
- t! = TIMER
- count = count + .1
- END IF
- LOOP UNTIL count = delay!
- END IF
-
- END SUB
-
- SUB SeaBattle (PType%, PGuns%)
-
- CLS
-
- LINE (5, 5)-(315, 195), 5, B
-
- SELECT CASE PType%
- CASE 1
- 'Pirates
- EnemyHealth = 40
- PDistance = 3
- END SELECT
-
- DO
- CLS
- LINE (5, 5)-(315, 195), 5, B
- LINE (5, 110)-(315, 110), 5
-
- 'PUT the cannons
- FOR PutIcon% = 1 TO Ship.cannon
- PUT (3 + (16 * PutIcon%), 3), cannon%
- NEXT PutIcon%
-
- 'PUT the ships.
- SELECT CASE PDistance
- CASE 3
- sX = 25: psX = 215
- CASE 2
- sX = 45: psX = 185
- CASE 1
- sX = 70: psX = 150
- END SELECT
- PUT (sX, 40), BigShipPic%
- SELECT CASE PType%
- CASE 1
- PUT (psX, 40), PirateShipPic%
- END SELECT
-
- 'Damage bar
- IF Ship.damage > 50 THEN
- COLOR 32
- ELSE
- COLOR 40
- END IF
- DamagePercent = (Ship.damage / 100) * 100
- LOCATE 15, 2: PRINT STRING$((Ship.damage / 4), 219) + " -" + STR$(DamagePercent) + "%"
- COLOR TextCol%
-
- 'Here's where the pirates fire at you.
- Hits = 0
- LOCATE 17, 2: PRINT "They're firing!" + STRING$(10, " ")
- FOR Shoot = 1 TO PGuns%
- 'The chance they'll actually have a hit.
- RANDOMIZE TIMER: HitChance = (RND * 100)
- IF PDistance = 1 THEN
- IF HitChance >= 15 THEN
- 'The most damage, and it's pretty hard to miss. Of course, at this
- 'range, it becomes a simple pounding match.
- Ship.damage = Ship.damage - 9
- Hits = Hits + 1
- END IF
- ELSEIF PDistance = 2 THEN
- IF HitChance >= 35 THEN
- Hits = Hits + 1
- 'Quite a bit better chance of a hit, and more damage.
- Ship.damage = Ship.damage - 7
- END IF
- ELSEIF PDistance = 3 THEN
- IF HitChance >= 72 THEN
- Hits = Hits + 1
- 'Further away, they have less chance of a hit, and do less damage.
- Ship.damage = Ship.damage - 5
- END IF
- END IF
- NEXT Shoot
-
- IF Hits >= 1 THEN
- SELECT CASE PDistance
- CASE 3
- FireCannon psX, 70, 40, 120, 3, sX, psX
- CASE 2
- FireCannon psX, 70, 35, 140, 3, sX, psX
- CASE 1
- FireCannon psX, 70, 30, 120, 3, sX, psX
- END SELECT
- ELSE
- RANDOMIZE TIMER: shotSpeedRnd = (RND * 10)
- SELECT CASE PDistance
- CASE 3
- FireCannon psX, 70, 20 + shotSpeedRnd, 125, 4, sX, psX
- CASE 2
- FireCannon psX, 70, 13 + shotSpeedRnd, 137, 4, sX, psX
- CASE 1
- FireCannon psX, 70, 2, 90, 4, sX, psX
- END SELECT
- END IF
-
- LOCATE 19, 3: PRINT Hits; "of"; PGuns%; "shots hit us."
- Pause 2
-
- 'Combat menus.
- 'Do the damage bar again, test for death.
- IF Ship.damage <= 0 THEN
- 'You've been sunk.
- EndBattle% = 1: GOSUB EndBattleLoop
- ELSEIF Ship.damage > 50 THEN
- COLOR 32
- ELSE
- COLOR 40
- END IF
- BlockPrint 15, 2, 21, 40, " "
- DamagePercent = (Ship.damage / 100) * 100
- LOCATE 15, 2: PRINT STRING$((Ship.damage / 4), 219) + " -" + STR$(DamagePercent) + "%"
- COLOR TextCol%
- LOCATE 17, 2: PRINT "What do you want to do?"
- 'If you've got cannons, show the menu option to fire them.
- IF Ship.cannon > 0 THEN
- LOCATE 19, 2: PRINT "(F)ire Cannon"
- IF Ship.cannon > 1 THEN LOCATE 19, 15: PRINT "s"
- END IF
- 'Move away from the enemy ship. If you're far enough away, this attempts
- 'to escape.
- IF PDistance = 3 THEN
- LOCATE 20, 2: PRINT "Run (A)way"
- ELSE
- LOCATE 20, 2: PRINT "Move (A)way"
- END IF
- 'Move towards the pirate ship.
- IF PDistance > 1 THEN
- LOCATE 21, 2: PRINT "Move (C)loser"
- 'If you're close enough to the enemy ship, then you can ram them, or
- 'attempt to board.
- 'ELSEIF PDistance = 1 THEN
- ' LOCATE 21, 2: PRINT "(R)am"
- ' LOCATE 22, 2: PRINT "(B)oard"
- END IF
-
- SeaBattleInput:
-
- SELECT CASE UCASE$(GetKey$)
- CASE "F"
- 'Fire your cannon
- IF Ship.cannon > 0 THEN
- 'Clear the menu.
- BlockPrint 17, 2, 22, 32, " "
- Hits = 0
- FOR Shoot = 1 TO Ship.cannon
- BlockPrint 17, 2, 19, 32, " "
- LOCATE 17, 2: PRINT "We're firing..." + STRING$(10, " ")
- 'The chance you'll actually have a hit.
- RANDOMIZE TIMER: HitChance = (RND * 100)
- IF PDistance = 1 THEN
- IF HitChance >= 15 THEN
- Hits = Hits + 1
- EnemyHealth = EnemyHealth - 9
- END IF
- ELSEIF PDistance = 2 THEN
- IF HitChance >= 35 THEN
- Hits = Hits + 1
- EnemyHealth = EnemyHealth - 7
- END IF
- ELSEIF PDistance = 3 THEN
- IF HitChance >= 72 THEN
- Hits = Hits + 1
- EnemyHealth = EnemyHealth - 5
- END IF
- END IF
- NEXT Shoot
-
- IF Hits >= 1 THEN
- OldEnemyHealth = EnemyHealth
- SELECT CASE PDistance
- CASE 3
- FireCannon 80, 70, 40, 30, 1, sX, psX
- CASE 2
- FireCannon 100, 70, 40, 30, 1, sX, psX
- CASE 1
- FireCannon 135, 70, 15, 10, 1, sX, psX
- END SELECT
- ELSE
- RANDOMIZE TIMER: shotSpeedRnd = (RND * 10)
- SELECT CASE PDistance
- CASE 3
- FireCannon 80, 70, 20 + shotSpeedRnd, 35, 2, sX, psX
- CASE 2
- FireCannon 100, 70, 13 + shotSpeedRnd, 47, 2, sX, psX
- CASE 1
- FireCannon 135, 70, 2, 90, 2, sX, psX
- END SELECT
- END IF
-
- LOCATE 19, 3: PRINT Hits; "of"; Ship.cannon; "hit them."
- Pause 1
- ELSE
- GOSUB SeaBattleInput
- END IF
- CASE "C"
- 'Move closer to the enemy ship
- IF PDistance > 1 THEN
- PDistance = PDistance - 1
- ELSE
- GOSUB SeaBattleInput
- END IF
- CASE "A"
- 'Move away from the enemy ship, if you're far enough, attempt to escape
- 'completely.
- IF PDistance < 3 THEN
- PDistance = PDistance + 1
- ELSEIF PDistance = 3 THEN
- 'The "run away" code goes here
- RANDOMIZE TIMER: EscapeChance% = INT(RND * 100)
- IF ShipFree% = Ship.capacity AND EscapeChance% >= 30 THEN
- EndBattle% = 3
- GOSUB EndBattleLoop
- ELSEIF ShipFree% < (Ship.capacity / 2) AND EscapeChance% >= 50 THEN
- EndBattle% = 3
- GOSUB EndBattleLoop
- ELSEIF ShipFree% < (Ship.capacity / 4) AND EscapeChance% >= 70 THEN
- EndBattle% = 3
- GOSUB EndBattleLoop
- END IF
- END IF
-
- CASE ELSE
- GOSUB SeaBattleInput
- END SELECT
-
- 'Decide whether or not to end the battle, and if so how much money you
- 'make from it, etc.
-
- IF Ship.damage <= 0 THEN
- EndBattle% = 1
- GOSUB EndBattleLoop
- END IF
-
- IF EnemyHealth <= 0 THEN
- EndBattle% = 2
- GOSUB EndBattleLoop
- END IF
-
- EndBattleLoop:
- LOOP UNTIL EndBattle% > 0
-
- SELECT CASE EndBattle%
- CASE 1
- 'You sink
- GameOver 1
- CASE 2
- 'They sink
- SELECT CASE PType%
- CASE 1
- RANDOMIZE TIMER: GainedCredits = INT(RND * 400)
- RANDOMIZE TIMER: CargoToAdd = INT(RND * 3) + 1
- RANDOMIZE TIMER: d% = INT(RND * ShipFree%)
- SELECT CASE CargoToAdd
- CASE 1
- Item$ = "contraband"
- CASE 2
- Item$ = "luxuries"
- CASE 3
- Item$ = "ore"
- END SELECT
-
- BlockPrint 17, 2, 22, 32, " "
- LOCATE 17, 2: PRINT "We sank them!"
- LOCATE 19, 2: PRINT "We've captured"; GainedCredits; "in cash."
- LOCATE 20, 2: PRINT "We've captured"; d%; "units of " + Item$
- LOCATE 22, 2: PRINT "Do you want to keep it? (y/n)"
- IF UCASE$(GetKey$) = "Y" THEN AddCargo d%, Item$, 1
- CASE 2
- END SELECT
-
- CASE 3
- 'You run
- BlockPrint 17, 2, 22, 32, " "
- LOCATE 17, 2: PRINT "We've escaped!"
- END SELECT
-
- END SUB
-
- FUNCTION SellPrice% (Item$)
- 'Returns a value for how much you can sell something for.
-
- SELECT CASE Item$
- CASE "cannon"
- Price% = 100
- CASE "wheat"
- Price% = CurrentPrices.wheat
- CASE "ore"
- Price% = CurrentPrices.ore
- CASE "luxuries"
- Price% = CurrentPrices.luxuries
- CASE "contraband"
- Price% = CurrentPrices.contraband
- CASE "equipment"
- Price% = CurrentPrices.equipment
- END SELECT
-
- SellPrice% = Price%
-
- END FUNCTION
-
- SUB SetPrices (d%)
-
- 'This sets the prices for all of the items at the marketplace.
- 'For now it just takes into account the type of city and time of year,
- 'but I plan on adding other economic factors.
-
- Year = FIX((GameState.gameDate / 12)) + 1850
- Month = GameState.gameDate - ((Year - 1850) * 12)
-
- SELECT CASE Month
- CASE 0 TO 5
- WheatModifier = 3
- CASE 6 TO 8
- WheatModifier = 1
- CASE 9 TO 11
- WheatModifier = 2
- END SELECT
-
-
- SELECT CASE Ports(d%).CType
- CASE "Agr"
- RANDOMIZE TIMER: CurrentPrices.wheat = 1 + (INT(RND * 10) * WheatModifier)
- RANDOMIZE TIMER: CurrentPrices.ore = 1 + INT(RND * 3)
- RANDOMIZE TIMER: CurrentPrices.luxuries = 1 + INT(RND * 3)
- RANDOMIZE TIMER: CurrentPrices.equipment = 500 + INT(RND * 2000)
- CASE "Ind"
- RANDOMIZE TIMER: CurrentPrices.wheat = 1 + INT(RND * 5)
- RANDOMIZE TIMER: CurrentPrices.ore = 10 + INT(RND * 60)
- RANDOMIZE TIMER: CurrentPrices.luxuries = 20 + INT(RND * 30)
- RANDOMIZE TIMER: CurrentPrices.equipment = 500 + INT(RND * 800)
- CASE "Min"
- RANDOMIZE TIMER: CurrentPrices.wheat = 5 + (INT(RND * 20) * WheatModifier)
- RANDOMIZE TIMER: CurrentPrices.ore = 2 + INT(RND * 25)
- RANDOMIZE TIMER: CurrentPrices.luxuries = 1 + INT(RND * 16)
- RANDOMIZE TIMER: CurrentPrices.equipment = 500 + INT(RND * 1000)
- CASE "Fun"
- RANDOMIZE TIMER: CurrentPrices.wheat = 1 + INT(RND * 6)
- RANDOMIZE TIMER: CurrentPrices.ore = 1 + INT(RND * 3)
- RANDOMIZE TIMER: CurrentPrices.luxuries = 5 + INT(RND * 50)
- RANDOMIZE TIMER: CurrentPrices.equipment = 400
- END SELECT
-
- RANDOMIZE TIMER: CurrentPrices.contraband = 10 + INT(RND * 100)
-
- END SUB
-
- FUNCTION ShipFree%
- 'Returns the amount of free space left in the ship.
-
- Space = 0
- Space% = Space% + Ship.cannon * 10
- Space% = Space% + Ship.wheat + Ship.ore + Ship.luxuries + Ship.contraband + Ship.equipment
-
- ShipFree% = Ship.capacity - Space%
-
- END FUNCTION
-
- SUB ShipMenu
-
- MainShip:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- PUT (10, 10), ShipIcon%
-
- 'Draw the cannons.
- FOR PutIcon% = 1 TO Ship.cannon
- PUT (30 + (16 * PutIcon%), 10), cannon%
- NEXT PutIcon%
-
- LOCATE 6, 3: PRINT "At ship in " + Ports(City%).CName
- LOCATE 8, 3: PRINT "What do you want to do?"
- LOCATE 10, 4: PRINT "1. Sail for Another Port"
- LOCATE 11, 4: PRINT "2. Upgrade or Repair Ship"
- LOCATE 12, 4: PRINT "3. Back to Main Menu"
-
- SELECT CASE VAL(GetKey$)
- CASE 1
- GOSUB SailAway
- CASE 2
- GOSUB ShipYard
- CASE 3
- EXIT SUB
- CASE ELSE
- GOSUB MainShip
- END SELECT
-
- 'This menu lets you upgrade/repair your ship.
- 'You can repair, buy cannons or a lifeboat, upgrade stuff, etc.
- ShipYard:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- PUT (10, 10), ShipIcon%
-
- 'Draw the cannons.
- FOR PutIcon% = 1 TO Ship.cannon
- PUT (30 + (16 * PutIcon%), 10), cannon%
- NEXT PutIcon%
-
- LOCATE 7, 3: PRINT "You have "; Ship.cannon; " Cannons."
- LOCATE 8, 3: PRINT "Ship condition: " + STR$(Ship.damage) + "%"
- LOCATE 9, 3: PRINT "You have "; Credits!; " Credits in cash."
- LOCATE 11, 4: PRINT "1. Repair Damage - 30 Credits"
- LOCATE 12, 4: PRINT "2. Buy a Cannon - 250 Credits"
- LOCATE 14, 4: PRINT "3. Done"
-
- SELECT CASE VAL(GetKey$)
- CASE 1 'Repair the ship.
- IF Ship.damage >= 100 THEN
- LOCATE 16, 3: PRINT "Your ship is already repaired."
- ELSEIF Ship.damage < 100 AND Credits! >= 30 THEN
- Credits! = Credits! - 30
- Ship.damage = Ship.damage + 10
- IF Ship.damage > 100 THEN Ship.damage = 100
- LOCATE 16, 3: PRINT "Repairs done."
- END IF
- WHILE INKEY$ = "": WEND
- GOSUB ShipYard
- CASE 2 'Buy a cannon
- IF Credits! >= 250 AND ShipFree% >= 10 THEN
- Credits! = Credits! - 250
- AddCargo 1, "cannon", 1
- LOCATE 16, 3: PRINT "Cannon Purchased"
- ELSEIF (Credits! < 250) OR (ShipFree% < 10) THEN
- LOCATE 16, 5: PRINT "You can't afford a new cannon."
- END IF
- WHILE INKEY$ = "": WEND
- GOSUB ShipYard
- CASE 3
- GOSUB MainShip
- CASE ELSE
- GOSUB ShipYard
- END SELECT
-
- SailAway:
- 'The menu of other ports to sail to. I'm sure there's a better way to do
- 'this, but I have no idea what it is.
- CLS
- LINE (5, 5)-(315, 195), 5, B
- PUT (10, 10), ShipIcon%
- LOCATE 4, 6: PRINT "Where do you want to sail?"
- IconPut 20, 44, Ports(1).CType
- IconPut 20, 68, Ports(2).CType
- IconPut 20, 92, Ports(3).CType
- IconPut 20, 116, Ports(4).CType
- IconPut 20, 140, Ports(5).CType
- LOCATE 8, 7: PRINT "1. " + Ports(1).CName
- LOCATE 11, 7: PRINT "2. " + Ports(2).CName
- LOCATE 14, 7: PRINT "3. " + Ports(3).CName
- LOCATE 17, 7: PRINT "4. " + Ports(4).CName
- LOCATE 20, 7: PRINT "5. " + Ports(5).CName
- IconPut 165, 44, Ports(6).CType
- IconPut 165, 68, Ports(7).CType
- IconPut 165, 92, Ports(8).CType
- IconPut 165, 116, "cancel"
- LOCATE 8, 25: PRINT "6. " + Ports(6).CName
- LOCATE 11, 25: PRINT "7. " + Ports(7).CName
- LOCATE 14, 25: PRINT "8. " + Ports(8).CName
- LOCATE 17, 25: PRINT "9. Cancel"
-
- d% = INT(VAL(GetKey$))
- IF d% <= 9 AND d% >= 1 THEN
- IF d% = City% THEN
- LOCATE 23, 5: PRINT "You're already there!"
- paws = TIMER: WHILE TIMER <= paws + 2: WEND
- GOSUB SailAway
- ELSEIF (d% <> City%) AND (ShipFree% < 0) THEN
- LOCATE 22, 5: PRINT "Your ship is overloaded!"
- LOCATE 23, 5: PRINT "Sell or move some cargo."
- paws = TIMER: WHILE TIMER <= paws + 1: WEND
- EXIT SUB
- ELSEIF d% = 9 THEN
- GOSUB MainShip
- ELSE
- GOSUB MovingShip
- END IF
- ELSE
- GOSUB SailAway
- END IF
-
- 'Sail to whatever your port of choice is.
- MovingShip:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- PUT (10, 10), ShipIcon%
- 'Show the cannons.
- FOR PutIcon% = 1 TO Ship.cannon
- PUT (30 + (16 * PutIcon%), 10), cannon%
- NEXT PutIcon%
- LOCATE 5, 3: PRINT "Sailing to "; Ports(d%).CName
- FOR MovingShip% = 5 TO 200 STEP 5
- WAIT &H3DA, 8
- PUT (25 + (MovingShip% - 5), 50), BigShipPic%
- PUT (25 + MovingShip%, 50), BigShipPic%, PSET
- Pause .3
- IF MovingShip% = 85 THEN
- SELECT CASE ShipFree%
- CASE 0 TO (Ship.capacity / 4)
- Chance = Chance + .4
- CASE ((Ship.capacity / 4) + 1) TO (Ship.capacity / 2)
- Chance = Chance + .3
- CASE ((Ship.capacity / 2) + 1) TO ((Ship.capacity / 4) * 3)
- Chance = Chance + .2
- END SELECT
- IF Ship.cannon >= 3 THEN Chance = Chance - (.1 * (INT(Ship.cannon / 3)))
- RANDOMIZE TIMER: Attack = RND + Chance
- IF GameState.paidPirates = 0 THEN
- SELECT CASE Attack
- CASE .85 TO .94
- 'Start a battle
- PAttacked% = 1
- SeaBattle 1, 2
- CASE .95
- 'Start a battle
- PAttacked% = 1
- SeaBattle 1, 3
- END SELECT
- ELSEIF GameState.paidPirates = 1 THEN
- IF Attack >= .99 THEN
- 'Start a battle
- PAttacked% = 1
- SeaBattle 1, 2
- END IF
- END IF
- IF PAttacked% = 1 THEN
- CLS
- LINE (5, 5)-(315, 195), 5, B
- PUT (10, 10), ShipIcon%
- 'Show the cannons.
- FOR PutIcon% = 1 TO Ship.cannon
- PUT (30 + (16 * PutIcon%), 10), cannon%
- NEXT PutIcon%
- LOCATE 5, 3: PRINT "Sailing to "; Ports(d%).CName
- PUT (25 + MovingShip%, 50), BigShipPic%, PSET
- END IF
- END IF
- NEXT MovingShip%
-
- RANDOMIZE TIMER: Storm = RND
-
- IF Storm >= .8 THEN
- StormCity% = 0
- StormRnd = 0
- CLS
- LINE (5, 5)-(315, 195), 5, B
- PUT (130, 30), StormPic%
- LOCATE 19, 3: PRINT "Storm!"
-
- Pause 1
-
- 'Calculate the effects of a storm.
- RANDOMIZE TIMER: StormRnd = RND * 10
- Ship.damage = Ship.damage - INT(StormRnd)
- LOCATE 21, 3: PRINT "The ship has taken " + STR$(INT(StormRnd)) + " Damage."
- IF Ship.damage <= 0 THEN
- 'You're sunk.
- GameOver 2
- END IF
- RANDOMIZE TIMER: StormRnd = RND
- IF StormRnd >= .6 THEN
- StormCity% = d% + 1
- IF StormCity% > 8 THEN StormCity% = d% - 1
- d% = StormCity%
- LOCATE 23, 3: PRINT "We've been blown to " + Ports(d%).CName
- END IF
- WHILE INKEY$ = "": WEND
- END IF
-
- 'Finished sailing, arrived without being killed, etc...
- 'This sub calculates interest at the bank, advances the date, triggers events,
- 'etc.
- Events d%
- City% = d%: EXIT SUB
-
- END SUB
-
- FUNCTION WareFree%
- 'Returns the amount of free space left in the warehouse.
-
- Space = 0
- Space% = Space% + WareHouse.cannon * 10
- Space% = Space% + WareHouse.wheat + WareHouse.ore + WareHouse.luxuries + WareHouse.contraband + WareHouse.equipment
-
- WareFree% = WareHouse.capacity - Space%
-
- END FUNCTION
-
- SUB WarehouseMenu
- MainWarehouse:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- 'Draw the city icon thingy.
- IconPut 10, 10, Ports(City%).CType
-
- LOCATE 5, 3: PRINT "You are at your warehouse."
- LOCATE 7, 3: PRINT " Cargo Free"
- LOCATE 8, 3: PRINT USING "Ship: #### ####"; (Ship.capacity - ShipFree%); ShipFree%
- LOCATE 9, 3: PRINT USING "Warehouse: ##### #####"; (WareHouse.capacity - WareFree%); WareFree%
-
- LOCATE 11, 3: PRINT "What do you want to do?"
- LOCATE 13, 4: PRINT "1. Transfer to ship"
- LOCATE 14, 4: PRINT "2. Transfer from ship"
- LOCATE 15, 4: PRINT "3. Back to Main Menu"
-
- SELECT CASE VAL(GetKey$)
- CASE 1
- GOSUB MoveToShip
- CASE 2
- GOSUB MoveFromShip
- CASE 3
- EXIT SUB
- CASE ELSE
- END SELECT
-
- MoveToShip:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- LOCATE 5, 3: PRINT "What do you want to transfer?"
- LOCATE 7, 4: PRINT "Item No."
- IF WareHouse.cannon > 0 THEN LOCATE 9, 4: PRINT USING "(C)annon ####"; WareHouse.cannon
- IF WareHouse.wheat > 0 THEN LOCATE 10, 4: PRINT USING "(W)heat ####"; WareHouse.wheat
- IF WareHouse.ore > 0 THEN LOCATE 11, 4: PRINT USING "(O)re ####"; WareHouse.ore
- IF WareHouse.luxuries > 0 THEN LOCATE 12, 4: PRINT USING "(L)uxury Goods ####"; WareHouse.luxuries
- IF WareHouse.contraband > 0 THEN LOCATE 13, 4: PRINT USING "Con(t)raband ####"; WareHouse.contraband
- IF WareHouse.equipment > 0 THEN LOCATE 14, 4: PRINT USING "(E)quipment ####"; WareHouse.equipment
- LOCATE 16, 4: PRINT "(D)one"
-
- 'There has *got* to be a better way to do this...
- SELECT CASE UCASE$(GetKey$)
- CASE "C"
- NumItems% = WareHouse.cannon: Item$ = "cannon"
- CASE "W"
- NumItems% = WareHouse.wheat: Item$ = "wheat"
- CASE "O"
- NumItems% = WareHouse.ore: Item$ = "ore"
- CASE "L"
- NumItems% = WareHouse.luxuries: Item$ = "luxuries"
- CASE "T"
- NumItems% = WareHouse.contraband: Item$ = "contraband"
- CASE "E"
- NumItems% = WareHouse.equipment: Item$ = "equipment"
- CASE "D"
- GOSUB MainWarehouse
- CASE ELSE
- GOSUB MoveToShip
- END SELECT
-
- LOCATE 18, 3: PRINT "You have "; NumItems%; " Units of " + Item$
- LOCATE 19, 3: INPUT "Number to move aboard ship: ", d%
- IF d% <= NumItems% AND d% <= ShipFree% THEN
- AddCargo d%, Item$, 1
- AddCargo -d%, Item$, 2
- LOCATE 20, 3: PRINT TAB(6); "Items Moved: "; d%; Item$
- ELSEIF d% > NumItems% THEN
- LOCATE 20, 3: PRINT "You don't have that many " + Item$ + "."
- END IF
-
- WHILE INKEY$ = "": WEND
- GOSUB MainWarehouse
-
- 'Move stuff from the ship into the warehouse.
- MoveFromShip:
- CLS
- LINE (5, 5)-(315, 195), 5, B
- LOCATE 5, 3: PRINT "What do you want to transfer?"
- LOCATE 7, 4: PRINT "Item No."
- IF Ship.cannon > 0 THEN LOCATE 9, 4: PRINT USING "(C)annon ####"; Ship.cannon
- IF Ship.wheat > 0 THEN LOCATE 10, 4: PRINT USING "(W)heat ####"; Ship.wheat
- IF Ship.ore > 0 THEN LOCATE 11, 4: PRINT USING "(O)re ####"; Ship.ore
- IF Ship.luxuries > 0 THEN LOCATE 12, 4: PRINT USING "(L)uxury Goods ####"; Ship.luxuries
- IF Ship.contraband > 0 THEN LOCATE 13, 4: PRINT USING "Con(t)raband ####"; Ship.contraband
- IF Ship.equipment > 0 THEN LOCATE 14, 4: PRINT USING "(E)quipment ####"; Ship.equipment
-
- SELECT CASE UCASE$(GetKey$)
- CASE "C"
- NumItems% = Ship.cannon: Item$ = "cannon"
- CASE "W"
- NumItems% = Ship.wheat: Item$ = "wheat"
- CASE "O"
- NumItems% = Ship.ore: Item$ = "ore"
- CASE "L"
- NumItems% = Ship.luxuries: Item$ = "luxuries"
- CASE "T"
- NumItems% = Ship.contraband: Item$ = "contraband"
- CASE "E"
- NumItems% = Ship.equipment: Item$ = "equipment"
- CASE "D"
- CASE ELSE
- END SELECT
-
- LOCATE 18, 3: PRINT "You have "; NumItems%; " Units of " + Item$
- LOCATE 19, 3: INPUT "Number to move to warehouse: ", d%
- IF d% <= NumItems% AND d% <= WareFree% THEN
- AddCargo -d%, Item$, 1
- AddCargo d%, Item$, 2
- LOCATE 20, 3: PRINT TAB(6); "Items Moved: "; d%; Item$
- ELSEIF d% > NumItems% THEN
- LOCATE 20, 3: PRINT "You don't have that many " + Item$ + "."
- END IF
-
- WHILE INKEY$ = "": WEND
- GOSUB MainWarehouse
-
- END SUB
-
|