Code archives/Miscellaneous/Rail Baron Pay Chart (Mac)

This code has been declared by its author to be Public Domain code.

Download source code

Rail Baron Pay Chart (Mac) by cps2015
Select start and destination areas/towns and get payment due
Import MaxGui.Drivers
SuperStrict
Local Tst1$=""
Local Temp1%=0; Local Temp2%=0; Local Temp3%=0; Local Temp4%=0; Local Temp5%=0
Local ScreenSize%=0
Local GUIFont:TGuiFont


Temp1=DesktopWidth()
If Temp1<640 Then' check to see if screen size allows 640 by 480
	Notify "Sorry screen sizes less than 640 by 480 "+Chr$(13)+"are not supported." 
	End' no support for less than 640 by 480
End If

Local Region:AreaNames = New AreaNames 'store containing area names
Region.initilise() ' loads the ara names


Local W1:TGadget = CreateWindow( "Rail Baron Payout Screen Size", 10,10,500,400,,WINDOW_CENTER | WINDOW_TITLEBAR)
Local W1Pan1:Tgadget=CreatePanel(20,20,460,360,W1)'Select screen size
Local W1Pan1Rad1:TGadget=CreateButton("640 by 480",180,70,100,20, W1Pan1,BUTTON_RADIO)
Local W1Pan1Rad2:TGadget=CreateButton("800 by 600",180,100,100,20, W1Pan1,BUTTON_RADIO)
Local W1Pan1Rad3:TGadget=CreateButton("1024 by 768",180,130,100,20, W1Pan1,BUTTON_RADIO)
Tst1="Please select the screen size you want to use "+Chr$(13)+"then click 'Continue'"
Local W1Pan1Lab1:TGadget=CreateLabel(Tst1,20,10,400,40, W1Pan1,LABEL_CENTER)
Local W1Pan1Lab2:TGadget=CreateLabel("",20,180,400,20, W1Pan1,LABEL_CENTER)
Local W1Pan1But1:TGadget=CreateButton("Continue",170,220,90,25,W1Pan1)

Tst1="You have selected "
If Temp1=640 Then 	
	SetButtonState(W1Pan1Rad1,True); Tst1=Tst1+"640 by 480"; DisableGadget(W1Pan1Rad2); DisableGadget(W1Pan1Rad3)
ElseIf Temp1=800 Then 
	SetButtonState(W1Pan1Rad2,True); Tst1=Tst1+"800 by 600"; DisableGadget(W1Pan1Rad3)	
Else
	SetButtonState(W1Pan1Rad3,True); Tst1=Tst1+"1024 by 768"	
End If
SetGadgetText(W1Pan1Lab2,Tst1)



'------------------------ Start Loop 1-------------------------
Temp1=0
Repeat
	PollEvent
	Select EventID()
  		Case EVENT_WINDOWCLOSE
  		   EndIt()
		Case EVENT_GADGETACTION
			Select EventSource()				
				Case W1Pan1Rad1'640 by 480
					SetGadgetText(W1Pan1Lab2,"You have selected 640 by 480")								
				Case W1Pan1Rad2'800 by 600
					SetGadgetText(W1Pan1Lab2,"You have selected 800 by 600")		
				Case W1Pan1Rad3' 1024 by 768
					SetGadgetText(W1Pan1Lab2,"You have selected 1024 by 768")
				Case W1Pan1But1 ' continue after chosing screen size
					If ButtonState(W1Pan1Rad1)=True Then
						ScreenSize=1
					Else If ButtonState(W1Pan1Rad2)=True Then
						ScreenSize=2
					Else 
						ScreenSize=3
					End If	
			End Select
	End Select
Until ScreenSize<>0
HideGadget(W1Pan1)
HideGadget(W1)

'------------------------ End Loop  1-------------------------
'ScreenSize=1 then 640 by 480 : ScreenSize=2 then 800 by 600 : ScreenSize=3 then 1024 by 768	
If Screensize=1 Then 
	temp1=10; temp2=10;temp3=638;temp4=478
Else If screensize=2 Then
	temp1=10; temp2=10;temp3=798;temp4=598
Else
	temp1=10; temp2=10;temp3=1022;temp4=766
End If
Local W2:TGadget = CreateWindow( "Rail Baron Payout Chart", temp1,temp2,temp3,temp4,,WINDOW_CENTER | WINDOW_TITLEBAR)
If screensize=1 Then temp2=28 Else If screensize=2 Then temp2=34 Else temp2=40
Local W2But1:Tgadget=CreateButton("Help",Temp1,Temp4-(Temp2+Temp1+24),3*Temp2,Temp2,W2)
Temp5=Temp3-(3*Temp2)-Temp1-5
Local W2But2:Tgadget=CreateButton("Exit",Temp5,Temp4-(Temp2+Temp1+24),3*Temp2,Temp2,W2)
Temp5=(Temp3/2)-50
Local W2But3:Tgadget=CreateButton("Mininimise",Temp5,Temp4-(Temp2+Temp1+24),100,Temp2,W2)


If Screensize=1 Then 'earnings panel ----------------
	temp1=187; temp2=20; temp3=257;temp4=390; GUIFont=LoadGuiFont( "Ariel",20)
Else If screensize=2 Then
	temp1=217; temp2=25;temp3=357;temp4=480; GUIFont=LoadGuiFont( "Ariel",28)
Else
	temp1=263; temp2=30;temp3=488;temp4=640; GUIFont=LoadGuiFont( "Ariel",36)
End If	
' use values below for PC font sizes
'GUIFont=LoadGuiFont( "Ariel",16) GUIFont=LoadGuiFont( "Ariel",18) GUIFont=LoadGuiFont( "Ariel",20)

Local W2P3:TGadget=CreatePanel(Temp1,Temp2,Temp3,Temp4,W2)
SetPanelColor(W2P3,250,250,250)
If screensize=1 Then temp5=35 Else If screensize=2 Then temp5=45 Else temp5=55
Local W2P3L1:TGadget=CreateLabel("xx",10,10,Temp3-20,Temp5,W2P3,LABEL_CENTER)
Local W2P3L2:TGadget=CreateLabel("to",(Temp3/2)-30,2*Temp5,60,Temp5,W2P3,LABEL_CENTER)
Local W2P3L3:TGadget=CreateLabel("xx",10,4*Temp5,Temp3-20,Temp5,W2P3,LABEL_CENTER)
Local W2P3L4:TGadget=CreateLabel("pays",(Temp3/2)-30,6*Temp5,60,Temp5,W2P3,LABEL_CENTER)
Local W2P3L5:TGadget=CreateLabel("0.0",10,8*Temp5,Temp3-20,Temp5,W2P3,LABEL_CENTER)
Local W2P3L6:TGadget=CreateLabel("Thousand Dollars.",10,10*Temp5,Temp3-20,Temp5,W2P3,LABEL_CENTER)
SetGadgetFont(W2P3L1,GUIFont); SetGadgetFont(W2P3L3,GUIFont); SetGadgetFont(W2P3L5,GUIFont)
SetGadgetTextColor(W2P3L1,1,220,1); SetGadgetTextColor(W2P3L3,1,1,220)


If Screensize=1 Then 'start panel ---------------------------
	temp1=3; temp2=20;temp3=180;temp4=390; GUIFont=LoadGuiFont( "Ariel",11)
Else If screensize=2 Then
	temp1=3; temp2=25;temp3=210;temp4=480; GUIFont=LoadGuiFont( "Ariel",14)
Else
	temp1=3; temp2=30;temp3=256;temp4=640; GUIFont=LoadGuiFont( "Ariel",18)
End If	
Local W2P1:TGadget=CreatePanel(Temp1,Temp2,Temp3,Temp4,W2,PANEL_GROUP,"Start")

'use values below for PC font sizes
' GUIFont=LoadGuiFont( "Ariel",9.4) GUIFont=LoadGuiFont( "Ariel",12) GUIFont=LoadGuiFont( "Ariel",14)

SetPanelColor(W2P1,100,255,100)
Temp5=(Temp4/2)-(Temp1+26)
Local W2P1Lst1:Tgadget=CreateListBox(Temp1,Temp1,Temp3-(4*Temp1),Temp5,W2P1)
Region.ShowRegions(W2P1Lst1)
Temp2=Temp5+Temp1+3
Local W2P1Lst2:Tgadget=CreateListBox(Temp1,Temp2,Temp3-(4*Temp1),Temp5+30,W2P1)
SelectGadgetItem(W2P1Lst1,0)'set default position of list 1, area names
Region.ShowTowns(0,W2P1Lst2)
SelectGadgetItem(W2P1Lst2,0)'set default position
Region.ShowSelection(0,0,W2P3L1); Region.SetStArea(0); Region.SetStTown(0)
SetGadgetFont(W2P1Lst1,GUIFont); SetGadgetFont(W2P1Lst2,GUIFont)


If Screensize=1 Then 'destination -------------------------
	temp1=449; temp2=20;temp3=180;temp4=390
Else If screensize=2 Then
	temp1=579; temp2=25;temp3=210;temp4=480
Else
	temp1=757; temp2=30;temp3=256;temp4=640
End If	
Local W2P2:TGadget=CreatePanel(Temp1,Temp2,Temp3,Temp4,W2,PANEL_GROUP,"Destination")
Temp1=3

SetPanelColor(W2P2,170,170,255)
Temp5=(Temp4/2)-(Temp1+26)
Local W2P2Lst1:Tgadget=CreateListBox(Temp1,Temp1,Temp3-(4*Temp1),Temp5,W2P2)
Region.ShowRegions(W2P2Lst1)
Temp2=Temp5+Temp1+3
Local W2P2Lst2:Tgadget=CreateListBox(Temp1,Temp2,Temp3-(4*Temp1),Temp5+30,W2P2)
SelectGadgetItem(W2P2Lst1,0)'set default position of list 1, area names
Region.ShowTowns(0,W2P2Lst2)
SelectGadgetItem(W2P2Lst2,0)'set default position
Region.ShowSelection(0,0,W2P3L3); Region.SetEndArea(0); Region.SetEndTown(0)
SetGadgetFont(W2P2Lst1,GUIFont); SetGadgetFont(W2P2Lst2,GUIFont)
Region.ShowPay(W2P3L5)	


'------------------------ Start of main loop -------------------------
Repeat
	PollEvent
	Select EventID()
  		Case EVENT_WINDOWCLOSE
  		   EndIt()
		Case EVENT_GADGETACTION
			Select EventSource()
				Case W2But3' minimise window
					MinimizeWindow(W2)
			
				Case W2But1'Help
					TsT1="Click on a Start Area : Top Left."+Chr$(13)
					Tst1=Tst1+"Click on a Start Town : Bottom Left."+Chr$(13)
					Tst1=Tst1+"Click on a Destination Area : Top Right."+Chr$(13)
					Tst1=Tst1+"Click on a Destination Town : Bottom Right."+Chr$(13)+Chr$(13)
					TsT1=Tst1+"Start and Destination plus payment shown in the centre."
					Notify(TsT1)

				Case W2But2 'Exit
					EndIt()				
			End Select
			
		Case EVENT_GADGETSELECT
		Select EventSource()
			Case W2P1Lst1' start area
				Temp1=EventData()
				If Temp1<>-1 Then 'something selected
				
					Region.ShowTowns(Temp1,W2P1Lst2)
					SelectGadgetItem(W2P1Lst2,0)'set default position
					Region.ShowSelection(Temp1,0,W2P3L1); Region.SetStArea(Temp1)
					Region.SetStTown(0); Region.ShowPay(W2P3L5)				
					
					
				End If		
			Case W2P1Lst2'start town	
				Temp1=EventData()
				If Temp1<>-1 Then 'something selected
					Region.ShowSelection(Region.GetStArea(),Temp1,W2P3L1)
					Region.SetStTown(Temp1); Region.ShowPay(W2P3L5)	
					
				End If
		
			
			Case W2P2Lst1' destination area
				Temp1=EventData()
				If Temp1<>-1 Then 'something selected						
					Region.ShowTowns(Temp1,W2P2Lst2)
					SelectGadgetItem(W2P2Lst2,0)'set default position
					Region.ShowSelection(Temp1,0,W2P3L3); Region.SetEndArea(Temp1)
					Region.SetEndTown(0); Region.ShowPay(W2P3L5)						
					
				End If	
				
			Case W2P2Lst2'destination town
				Temp1=EventData()
				If Temp1<>-1 Then 'something selected
					Region.ShowSelection(Region.GetEndArea(),Temp1,W2P3L3)
					Region.SetEndTown(Temp1); Region.ShowPay(W2P3L5)	
				
				End If
						
      	End Select

		
			
			
			
	End Select
Forever

'------------------------ End of Main Loop -------------------------	

'------------------------ Start of Functions -------------------------


Function EndIt()'common exit point
	Select Confirm("Are you sure you want to quit?")
		Case 1
			End
		Case 0	
			Return
	End Select
End Function

'------------------------ End of Functions -------------------------

'   ---------------------           Start of Types    ---------------

Type AreaNames Extends TownNames	
	Global Dat$' working directory
	Field Town:TownNames[7]' town names by area
	Field Names$[7]'area names
	Field NumTown%[7]' number of towns in a given area
	Field StArea%=0' start area index
	Field EndArea%'destination area index
	Field StTown%=0' start town index
	Field EndTown%=0' destination town index
	Field Chart$[67,67]' payment chart in thousands of dollars
		
	Method Initilise()' loads area and town names into vars
		Local Tx1%=0; Local Tx2%=0
		Local Myfile:TStream
		
		Dat=CurrentDir()
		Names[0]="NORTHEAST"; Names[1]="SOUTHEAST"; Names[2]="NORTH CENTRAL"
		Names[3]="SOUTH CENTRAL"; Names[4]="PLAINS"; Names[5]="NORTHWEST"
		Names[6]="SOUTHWEST"
		NumTown[0]=9; NumTown[1]=11; NumTown[2]=8; NumTown[3]=11; NumTown[4]=9
		NumTown[5]=9; NumTown[6]=10
		For Tx1=0 To 6
			Town[Tx1]=New TownNames
		Next		
		MyFile=ReadFile(Dat+"/NAMES.DAT")		
		For Tx1=0 To 6
			For Tx2=0 To NumTown[Tx1]-1
				Town[Tx1].TName[Tx2]=ReadLine(MyFile)		
			Next
		Next
		CloseStream MyFile		
		MyFile=ReadFile(Dat+"/PAYS.DAT")		
		For Tx1=0 To 66
			For Tx2=0 To 66
				Chart[Tx1,Tx2]=ReadLine(MyFile)
			Next
		Next
		CloseStream MyFile		
	End Method

	Method ShowPay(Lst:TGadget)'expects label name to show payment in
		Local Tx1%=0 ; Local Tx2%=0; Local Tx3%=0
 		If StArea=0 Then
			Tx2=0
		Else
			For Tx1=0 To StArea-1
				Tx2=Tx2+NumTown[Tx1]
			Next
		End If
		Tx2=Tx2+StTown' tx2= index position of start town for payment chart array		
		If EndArea=0 Then
			Tx3=0
		Else
			For Tx1=0 To EndArea-1
				Tx3=Tx3+NumTown[Tx1]
			Next
		End If
		Tx3=Tx3+EndTown' tx3= index position of end town for payment chart array	
		SetGadgetText(Lst,Chart[Tx2,Tx3])
	End Method
	
	Method ShowRegions(Lst:Tgadget)'expects list name to display in
		Local Tx1%=0
		ClearGadgetItems(Lst)
		For Tx1=0 To 6
			AddGadgetItem(Lst,Names[Tx1])
		Next
	End Method
	
	Method ShowTowns(Tx1%,Lst:TGadget)' tx1 = area index 0 to 6: Lst = list gadget name for output
		Local Tx2%=0
		ClearGadgetItems(Lst)
		For Tx2=0 To NumTown[Tx1]-1
			AddGadgetItem(Lst,Town[Tx1].TName[Tx2])		
		Next		
	End Method
	
	Method ShowSelection(Tx1%,Tx2%,Lab:Tgadget)' tx1=area index, tx2=town index, lab = where to show it
		SetGadgetText(Lab,Town[Tx1].TName[Tx2])	
	End Method

	Method SetStArea(Tx1%)' set start area index
		StArea=Tx1
	End Method
	
	Method GetStArea%()' get start area index
		Local Tx2%=0
		Tx2=StArea
		Return Tx2
	End Method
	
	Method SetEndArea(Tx1%)' set destination area index
		EndArea=Tx1
	End Method
	
	Method GetEndArea%()'get destination index
		Local Tx2%=0
		Tx2=EndArea
		Return Tx2
	End Method
	
	Method SetStTown(Tx1%)' set start town index
		StTown=Tx1
	End Method
	
	Method SetEndTown(Tx1%)' set detination town index
		EndTown=Tx1
	End Method

End Type


Type TownNames
	Field TName$[11]

End Type

Comments

cps2015
Sorry needs the data files pays.dat and names.dat to work.
Can't see how to include them here. They are part of the compressed version on my web site.


Brucey2015
Nice :-)

Github is a convenient place to host your "open" source. You can also keep your data there within a downloadable folder structure. Git is also good for keeping track of the history your program versions.
Here's an example of some different BlitzMax apps and mods hosted there : https://github.com/bmx-ng


cps2015
Thanks for the info and your digital snipits, happy programing.


Code Archives Forum