Skip to content

Instantly share code, notes, and snippets.

@avibryant
Last active April 28, 2020 19:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save avibryant/bcb458b57d6276b11b007158f7c70072 to your computer and use it in GitHub Desktop.
Save avibryant/bcb458b57d6276b11b007158f7c70072 to your computer and use it in GitHub Desktop.
SystemOrganization addCategory: #'Diplomatik-Game'!
SystemOrganization addCategory: #'Diplomatik-Judge'!
SystemOrganization addCategory: #'Diplomatik-Users'!
SystemOrganization addCategory: #'Diplomatik-UI'!
WAComponent subclass: #DAdmin
instanceVariableNames: 'password'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DAdmin class methodsFor: 'as yet unclassified' stamp: 'avi 5/2/2008 23:27'!
canBeRoot
^ true! !
!DAdmin methodsFor: 'as yet unclassified' stamp: 'avi 5/2/2008 23:22'!
renderContentOn: html
html strong: 'Database: '.
html anchor callback: [DDatabase reset]; text: 'reset'.
html space.
html anchor callback: [DDatabase load]; text: 'load'.
html paragraph.
html strong: 'Games:'.
html break.
DDatabase default games do:
[:ea |
self renderGame: ea on: html].
html paragraph.
html strong: 'Users:'.
html break.
DDatabase default users do:
[:ea |
self renderUser: ea on: html]! !
!DAdmin methodsFor: 'as yet unclassified' stamp: 'avi 5/11/2008 13:12'!
renderGame: aGame on: html
[html text: aGame name.
html space.
html text: (aGame allUsers collect: [:ea | ea name]) asArray printString.
html space.
html text: (aGame currentStage season name, ' ', aGame currentStage phaseName).
html space.
html text: (aGame deadline - DateAndTime now) asString.
html space.
html anchor callback: [DDatabase default reloadGame: aGame]; text: 'reload'.
html space.
aGame isInTimeout
ifTrue: [html anchor callback: [aGame clearTimeout]; text: '-timeout']
ifFalse: [html anchor callback: [aGame startTimeout]; text: '+timeout'].
html space.
html anchor callback: [aGame advanceTurn]; text: 'advance'.
html space.
html anchor callback: [aGame deadline: aGame deadline + aGame stageDuration]; text: '+deadline'.
html space.
html anchor callback: [aGame deadline: aGame deadline - aGame stageDuration]; text: '-deadline'.
html space.
html anchor callback: [DDatabase default removeGame: aGame]; text: 'delete'.
html break.
html form:
[html textInput value: (aGame stageDuration asSeconds / 3600); callback: [:v | aGame stageDuration: v asNumber hours].
html text: ' Hours'.
html space.
html submitButton].
html unorderedList:
[aGame currentStage orders keys do:
[:ea |
html listItem:
[html text: ea.
html space.
html text: (aGame currentStage orders at: ea) unitPosition.
html anchor callback: [aGame currentStage orders removeKey: ea]; text: 'delete']]]] ifError: [:e | html text: e]! !
!DAdmin methodsFor: 'as yet unclassified' stamp: 'avi 5/2/2008 23:21'!
renderUser: aUser on: html
html form:
[html text: aUser name.
html text: ' - '.
html text: aUser email.
html space.
html textInput callback: [:v | password := v].
html space.
html submitButton callback: [aUser setPassword: password]; text: 'Change Password']! !
WAComponent subclass: #DDialog
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
DDialog subclass: #DCreateAccount
instanceVariableNames: 'email password confirmation name'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DCreateAccount methodsFor: 'as yet unclassified' stamp: 'avi 4/7/2008 23:56'!
boxClass
^ 'login'! !
!DCreateAccount methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 01:38'!
email: aString
email := aString! !
!DCreateAccount methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:00'!
finish
| user |
email isEmptyOrNil ifTrue: [^ self].
password isEmptyOrNil ifTrue: [^ self].
name isEmptyOrNil ifTrue: [^ self].
password = confirmation ifFalse: [^ self].
(DDatabase default userWithEmail: email) ifNotNil: [^ self].
user := DUser email: email password: password name: name.
(DDatabase default addUser: user).
self answer: user! !
!DCreateAccount methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 01:39'!
password: aString
password := aString! !
!DCreateAccount methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 01:38'!
renderBoxOn: html
html div id: 'loginBox'; with:
[html form:
[html heading level: 2; with: 'Creating a new account'.
html paragraph: 'Please confirm your password and enter a name for other people to use to identify you.'.
html definitionList:
[html definitionTerm: [html label for: 'emailAddress'; with: 'Email address:'].
html definitionData: [html textInput id: 'emailAddress'; value: email; callback: [:v | email := v]].
html definitionTerm: [html label for: 'password'; with: 'Password:'].
html definitionData: [html passwordInput id: 'password'; class: 'text'; value: password; callback: [:v | password := v]].
html definitionTerm: [html label for: 'password2'; with: 'Confirm password:'].
html definitionData: [html passwordInput id: 'password2'; class: 'text'; callback: [:v | confirmation := v]].
html definitionTerm: [html label for: 'name'; with: 'Name:'].
html definitionData: [html textInput id: 'name'; callback: [:v | name := v]].
html definitionTerm.
html definitionData:
[html submitButton class: 'submit button'; callback: [self finish]; text: 'Finish']]]]! !
!DDialog methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 21:45'!
boxClass
^ ''! !
!DDialog methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 21:45'!
renderBoxOn: html! !
!DDialog methodsFor: 'as yet unclassified' stamp: 'avi 5/5/2008 12:56'!
renderContentOn: html
html div class: 'globalBox'; class: self boxClass; with:
[html heading: 'Diplomati.ca'.
self renderBoxOn: html]! !
!DDialog methodsFor: 'as yet unclassified' stamp: 'avi 5/5/2008 12:56'!
updateRoot: aRoot
aRoot title: 'Diplomati.ca'.
aRoot javascript resourceUrl: 'js/prototype.js'.
aRoot javascript resourceUrl: 'js/login.js'.
aRoot stylesheet resourceUrl: 'css/default.css'.
aRoot stylesheet resourceUrl: 'css/login.css'.
! !
DDialog subclass: #DGameMenu
instanceVariableNames: 'user game'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:03'!
boxClass
^ 'gameMenu'! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/10/2008 21:24'!
joinUrlForGame: aGame
| url |
url := self session application baseUrl.
url takeServerParametersFromRequest: self session currentRequest.
url addParameter: 'game' value: aGame token.
^ url asString! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/12/2008 00:10'!
newGameNamed: aString
game := DGame new name: aString.
game addUser: user.
DDatabase default addGame: game! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:03'!
renderBoxOn: html
html div id: 'menuBox'; with:
[html form:
[self renderExistingGamesOn: html.
self renderNewGameOn: html]]! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 15:29'!
renderExistingGame: aGame on: html
|power url |
html div class: 'gameMenuBox'; with:
[power := aGame powerForUser: user.
self renderMiniMapFor: aGame on: html.
html anchor
callback: [self answer: aGame];
class: 'miniMapLink'.
html paragraph:
[html strong class: 'gameLink'; with:
[html anchor
callback: [self answer: aGame];
text: aGame name].
html text: ' - '.
html emphasis class: 'gameDate'; with: aGame currentStage season name.
html text: ' - '.
html span class: 'gameStatus'; with: aGame currentStage phaseName.
html text: ' - '.
html span class: 'playerCountry'; class: power id; with: power name].
aGame canStart ifFalse:
[html paragraph:
[html strong: 'This game has ', aGame allUsers size asString, ' of ', aGame map powers size asString, ' players. More players can join by going to this link: '.
html break.
url := self joinUrlForGame: aGame.
html anchor class: 'gameInviteLink'; target: '_blank'; url: url; text: url]]]! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/9/2008 23:02'!
renderExistingGamesOn: html
| games |
games := DDatabase default gamesForUser: user.
games isEmpty ifTrue: [^ self].
html heading level: 2; with: 'Enter an existing game'.
games do:
[:ea |
self renderExistingGame: ea on: html]! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:00'!
renderMiniMapFor: aGame on: html
html render: (DMiniMapViewer stage: aGame currentStage power: (aGame powerForUser: user))! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/12/2008 00:12'!
renderNewGameOn: html
html heading level: 2; with: 'Create a new game'.
html form:
[html paragraph:
[html strong: 'Game name: '.
html textInput callback: [:v | self newGameNamed: v]].
html paragraph:
[html strong: 'Turn length: '.
html textInput
style: 'width: 2em';
value: 24;
callback: [:v | game stageDuration: v asNumber hours].
html text: ' hours'].
html paragraph: [html submitButton text: 'Create game']]! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/10/2008 21:08'!
updateRoot: aRoot
super updateRoot: aRoot.
aRoot stylesheet resourceUrl: 'css/gameMenu.css'.
! !
!DGameMenu methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:37'!
user: aUser
user := aUser! !
DDialog subclass: #DLoginPage
instanceVariableNames: 'email password user joinGame'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DLoginPage class methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:37'!
canBeRoot
^ true! !
!DLoginPage methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 21:46'!
boxClass
^ 'login'! !
!DLoginPage methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 01:39'!
createAccount
user := self call: (DCreateAccount new email: email; password: password).
self successfulLogin! !
!DLoginPage methodsFor: 'as yet unclassified' stamp: 'avi 4/10/2008 23:58'!
initialRequest: aRequest
aRequest at: 'game' ifPresent:
[:t |
DDatabase default games do:
[:ea |
ea token = t ifTrue:
[joinGame := ea]]]! !
!DLoginPage methodsFor: 'as yet unclassified' stamp: 'avi 4/7/2008 23:55'!
login
user := DDatabase default userWithEmail: email.
user ifNotNil: [(user hasPassword: password) ifTrue: [self successfulLogin]]! !
!DLoginPage methodsFor: 'as yet unclassified' stamp: 'avi 4/12/2008 00:22'!
renderBoxOn: html
html div id: 'loginBox'; with:
[html form id: 'loginForm'; with:
[html definitionList:
[html definitionTerm: [html label for: 'emailAddress'; with: 'Email address:'].
html definitionData: [html textInput id: 'emailAddress'; callback: [:v | email := v]].
html definitionTerm: [html label for: 'password'; with: 'Password:'].
html definitionData: [html passwordInput id: 'password'; class: 'text'; callback: [:v | password := v]].
html definitionTerm.
html definitionData:
[html submitButton class: 'submit button'; callback: [self login]; text: 'Sign in'.
html text: ' or '.
html submitButton class: 'submit button'; callback: [self createAccount]; text: 'Create new account']]]].
! !
!DLoginPage methodsFor: 'as yet unclassified' stamp: 'avi 4/10/2008 23:59'!
successfulLogin
| game |
joinGame ifNotNil: [joinGame addUser: user].
game := self call: (DGameMenu new user: user).
self call: (DGameViewer game: game user: user)! !
WAComponent subclass: #DGameViewer
instanceVariableNames: 'game user'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DGameViewer class methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:40'!
game: aGame user: aUser
^ self new setGame: aGame user: aUser! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 2/1/2009 23:01'!
parseOrders: aString
|orders|
orders := DOrderParser parseString: aString stage: self stage.
(orders select: [:ea | ea power = self power]) do:
[:ea |
self stage addOrder: ea].
game save.
self session returnResponse: (WAResponse new nextPutAll: 'OK')! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:26'!
phaseClass
self stage isBuildStage ifFalse: [^ self stage typeName asLowercase, 'Phase'].
(self stage buildDeltaForPower: self power) >= 0 ifTrue: [^ self stage typeName asLowercase, 'Phase'].
^ 'disbandPhase'! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 01:00'!
power
^ game powerForUser: user! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/12/2008 15:25'!
previousStage
^ game stages at: game stages size - 1! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:12'!
renderBuildsFor: aPower on: html
|delta|
delta := self stage buildDeltaForPower: aPower.
delta = 0 ifTrue: [^ self].
html listItem class: aPower id; with:
[delta > 0 ifTrue:
[html text: aPower name, ' can build ', delta asString, ' unit'.
delta > 1 ifTrue: [html text: 's']].
delta < 0 ifTrue:
[html text: aPower name, ' must disband ', delta abs asString, ' unit'.
delta < -1 ifTrue: [html text: 's']]]! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:18'!
renderContentOn: html
html div
class: 'globalBox';
class: self stage season typeName asLowercase;
class: self phaseClass;
with:
[html heading: self stage season name.
html heading id: 'gameTitle'; with: game name.
html div id: 'moveBox'; with:
[html heading level: 2; with: self stage phaseName.
self renderMoveBoxOn: html].
html div id: 'statusBox'; with:
[self renderStatusBoxOn: html].
html div class: 'mapBox'; id: 'mapBox'; with:
[self renderMapOn: html.
self renderMenusOn: html]].
self renderScriptsOn: html! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 20:01'!
renderDecisionsFor: aPower on: html
|decisions|
decisions := self stage decisions select: [:ea | ea power = aPower].
decisions do: [:ea | html render: ea viewer]! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/12/2008 15:25'!
renderDecisionsOn: html
html unorderedList class: 'moveList'; id: 'pastMovesList'; with:
[self stage isBuildStage ifTrue:
[self renderBuildsFor: self power on: html.
(game map powers copyWithout: self power) do:
[:ea |
self renderBuildsFor: ea on: html]].
self stage isRetreatStage ifTrue:
[self renderRetreatsFor: self power on: html.
(game map powers copyWithout: self power) do:
[:ea |
self renderRetreatsFor: ea on: html]].
self renderDecisionsFor: self power on: html.
(game map powers copyWithout: self power) do:
[:ea |
self renderDecisionsFor: ea on: html]].
(self previousStage notNil and: [self previousStage isRetreatStage]) ifTrue:
[self renderPreviousDecisionsOn: html]! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 02:00'!
renderFormOn: html
html form id: 'orderForm'; style: 'display: none'; with:
[html hiddenInput
id: 'json';
callback: [:v | self parseOrders: v].
html submitButton text: 'Submit Orders'].
! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:00'!
renderMapOn: html
html render: (DMapViewer stage: self stage power: self power)! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:21'!
renderMenusOn: html
html render: (DMenuViewer stage: self stage power: self power) ! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:22'!
renderMoveBoxOn: html
self stage decisions isEmpty ifFalse:
[html heading level: 3; class: 'pastMoves'; with: 'Move Results'.
html div class: 'moveListBox'; with:
[self renderDecisionsOn: html]].
html heading level: 3; class: 'futureMoves'; with: 'Moves for ', self stage season name.
html div class: 'moveListBox'; with:
[html unorderedList class: 'moveList'; id: 'futureMovesList'.
self renderFormOn: html].! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/12/2008 22:25'!
renderPreviousDecisionsOn: html
" |decisions|
game map powers do:
[:p |
decisions := self previousStage decisions select: [:ea | ea power = p].
decisions do: [:ea | html render: ea viewer]]"! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:51'!
renderRetreatsFor: aPower on: html
(self stage retreatsForPower: aPower) ifNotEmptyDo:
[:units |
units do:
[:ea |
html listItem class: aPower id; with:
[html text: (self stage retreatPositionOf: ea) name.
html text: ' must retreat']]]! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 01:51'!
renderScriptsOn: html
html script: 'Dip.moveMap = ', (Json render: self stage moveMap).
html script: 'Dip.convoyMap = ', (Json render: self stage convoyMap).
html script: 'Dip.retreatMap = ', (Json render: self stage retreatMap).
html script: 'Dip.orders = ', (Json render: (self stage ordersForPower: self power)).
html script: 'Dip.player = ', self power id printString.
html script: 'Dip.deadline = new Date(); Dip.deadline.setTime(Dip.deadline.getTime() + (', game deadline asJavascript, ' - ', DateAndTime now asJavascript, '))'! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 15:14'!
renderStatusBoxOn: html
html table class: 'statusTable'; with:
[self renderStatusTableHeadOn: html.
html tableBody:
[self sortedPowers do:
[:ea |
self renderStatusRowFor: ea on: html]]]! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 17:20'!
renderStatusRowFor: aPower on: html
|aUser timeouts |
aUser := game userForPower: aPower.
aUser ifNil: [^ self].
html tableRow
class: aPower id;
class: (user = aUser ifTrue: ['myStatus'] ifFalse: ['']);
with:
[html tableData class: 'statusSupplyCenters'; with: (self stage supplyCentersForPower: aPower) size.
html tableData class: 'statusExtensions'; with:
[timeouts := (game timeoutsForPower: aPower).
html text: timeouts].
html tableHeading class: 'statusCountry'; with:
[html heading level: 4; with: aPower name.
user = aUser ifTrue: [html text: 'You'] ifFalse:
[html anchor
class: 'mailLink';
url: 'mailto:' , (aUser email);
text: aUser name]].
html tableData class: 'statusHasSubmittedOrders'; with:
[(self stage powersWithoutOrders includes: aPower)
ifTrue:
[game isInTimeout ifTrue:
[html image
attributeAt: 'border' put: '0';
resourceUrl: 'img/stopwatch.png']]
ifFalse: [html image
attributeAt: 'border' put: '0';
resourceUrl: 'img/checkmark.png']]]! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/9/2008 03:49'!
renderStatusTableHeadOn: html
html tableHead:
[html tableRow:
[html tableData class: 'statusSupplyCenters'; with:
[html image
resourceUrl: 'img/supplyCenter.png';
altText: 'Supply centers controlled';
width: 15; height: 15].
html tableData:
[html image
resourceUrl: 'img/stopwatch.png';
altText: 'Time extensions remaining';
width: 15; height: 15].
html tableHeading
class: 'statusCountry';
colSpan: 2;
with: [html space]]].! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:03'!
setGame: aGame user: aUser
game := aGame.
user := aUser! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/9/2008 04:03'!
sortedPowers
^ game map powers asSortedCollection:
[:a :b |
(self stage supplyCentersForPower: a) size >=
(self stage supplyCentersForPower: b) size]! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:03'!
stage
^ game currentStage! !
!DGameViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/5/2008 12:56'!
updateRoot: aRoot
aRoot title: 'Diplomati.ca'.
aRoot javascript resourceUrl: 'js/prototype.js'.
aRoot javascript resourceUrl: 'js/main.js'.
aRoot javascript resourceUrl: 'js/scriptaculous-mini.js'.
aRoot stylesheet resourceUrl: 'css/default.css'.
! !
Object subclass: #DCancelOrder
instanceVariableNames: 'place stage'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DCancelOrder class methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:45'!
place: aPlace
^ self basicNew setPlace: aPlace! !
!DCancelOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:07'!
isCancel
^ true! !
!DCancelOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:46'!
place
^ place! !
!DCancelOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:36'!
power
^ stage controllingPowerFor: place! !
!DCancelOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:36'!
setPlace: aPlace
place := aPlace! !
!DCancelOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:36'!
stage: aStage
stage := aStage! !
Object subclass: #DConvoyMapBuilder
instanceVariableNames: 'sources targets fleets'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DConvoyMapBuilder class methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 22:46'!
sources: aCollection targets: bCollection fleets: fCollection
^ self basicNew setSources: aCollection targets: bCollection fleets: fCollection! !
!DConvoyMapBuilder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:27'!
hasRoute
^ self map anySatisfy: [:ea | ea isEmpty not]! !
!DConvoyMapBuilder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 22:44'!
map
| map s t |
map := Dictionary new.
fleets do:
[:ea |
s := self sourcesFor: ea.
t := self targetsFor: ea.
s do:
[:p |
(map at: p ifAbsentPut: [Set new]) addAll: (t copyWithout: p)]].
^ map! !
!DConvoyMapBuilder methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:01'!
neighborsFor: aPlace from: aCollection seen: aSet
(aSet includes: aPlace) ifTrue: [^ #()].
aSet add: aPlace.
(aCollection includes: aPlace) ifTrue: [^ Array with: aPlace].
(fleets includes: aPlace) ifTrue: [^ aPlace allNeighbors gather: [:ea | self neighborsFor: ea from: aCollection seen: aSet]].
^ #()! !
!DConvoyMapBuilder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 22:46'!
setSources: aCollection targets: bCollection fleets: fCollection
sources := aCollection.
targets := bCollection.
fleets := fCollection! !
!DConvoyMapBuilder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:21'!
sourcesFor: aPlace
^ self neighborsFor: aPlace from: sources seen: Set new! !
!DConvoyMapBuilder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:21'!
targetsFor: aPlace
^ self neighborsFor: aPlace from: targets seen: Set new! !
Object subclass: #DDatabase
instanceVariableNames: 'users games migrations'
classVariableNames: 'Default'
poolDictionaries: ''
category: 'Diplomatik-Users'!
!DDatabase class methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:41'!
default
^ Default ifNil: [Default := self new]! !
!DDatabase class methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 10:59'!
initialize
self default tryMigrations! !
!DDatabase class methodsFor: 'as yet unclassified' stamp: 'avi 5/2/2008 22:52'!
load
|s dir|
dir := FileDirectory default directoryNamed: 'games'.
dir fileNames do:
[:ea |
s := ReferenceStream on: (dir fileNamed: ea).
self default loadGame: s next.
s close]! !
!DDatabase class methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 23:16'!
reset
Default := nil! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:55'!
addGame: aGame
games add: aGame! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:00'!
addUser: aUser
users add: aUser.
^ aUser! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 21:57'!
directoryForGame: aGame
|dir|
dir := (FileDirectory default directoryNamed: 'games') directoryNamed: aGame token.
dir assureExistence.
^ dir! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 11:12'!
fixBulgaria
| bul |
DDatabase default games do:
[:game |
bul := game map placeNamed: 'Bulgaria'.
(bul hasCoast: #north)
ifTrue:
[(bul neighborsForCoast: #north)
do: [:ea | bul addNeighbor: ea coast: #east].
bul removeCoast: #north]]! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:44'!
games
^ games! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:21'!
gamesForUser: aUser
^ games select: [:ea | ea allUsers includes: aUser]! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:44'!
initialize
users := OrderedCollection new.
games := OrderedCollection new! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/21/2008 17:58'!
loadGame: aGame
|user|
self addGame: aGame.
aGame allUsers do:
[:ea |
user := self userWithEmail: ea email.
user
ifNil: [self addUser: ea]
ifNotNil: [aGame replaceUser: ea with: user]]! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 10:59'!
migrations
^ migrations ifNil: [migrations := Set new]! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 5/11/2008 13:13'!
reloadGame: aGame
| dir s |
games remove: aGame.
dir := FileDirectory default directoryNamed: 'games'.
s := ReferenceStream on: (dir fileNamed: aGame token, '.obj').
self loadGame: s next.
s close! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 5/5/2008 20:36'!
removeGame: aGame
games remove: aGame ifAbsent: [^ self].
(FileDirectory default directoryNamed: 'games') deleteFileNamed: aGame token, '.obj'! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/21/2008 17:40'!
saveGame: aGame
(ReferenceStream on: (FileStream forceNewFileNamed: 'games/', aGame token, '.obj'))
nextPut: aGame;
close! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 11:12'!
tryMigrations
#(fixBulgaria) do: [:ea |
(self migrations includes: ea)
ifFalse: [self perform: ea.
migrations add: ea]]! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:44'!
userWithEmail: aString
^ users detect: [:ea | ea email = aString] ifNone: []! !
!DDatabase methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:56'!
users
^ users! !
Object subclass: #DDecision
instanceVariableNames: 'judge'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:21'!
hash
^ self species hash! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isAttackStrength
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:50'!
isBuildDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isDefendStrength
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:12'!
isDisbandDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:11'!
isDislodgeDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isHoldStrength
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:39'!
isMoveDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:24'!
isOrderDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:26'!
isPathDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isPreventStrength
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:51'!
isRetreatDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:42'!
isSupportDecision
^ false! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 00:42'!
renderMoveOn: html
html text: self move unitPosition name.
html text: ' - '.
html text: self move target name.! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 00:21'!
renderOn: html! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:19'!
setJudge: aJudge
judge := aJudge! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:33'!
updateStage: aStage
! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 15:33'!
viewer
^ self viewerClass decision: self! !
!DDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 15:38'!
viewerClass
^ DBlankDecisionViewer! !
DDecision subclass: #DOrderDecision
instanceVariableNames: 'succeeds order'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
DOrderDecision subclass: #DBuildDecision
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DBuildDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:50'!
isBuildDecision
^ true! !
!DBuildDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:58'!
shouldFail
^ self shouldSucceed not! !
!DBuildDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:02'!
shouldSucceed
^ (order stage buildDeltaForPower: order unit power) > self successfulBuilds size! !
!DBuildDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:00'!
successfulBuilds
^ judge decisions select:
[:ea |
ea isBuildDecision
and: [ea order power = self order power]
and: [ea isSuccessful]]! !
!DBuildDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:37'!
updateStage: aStage
self isSuccessful ifTrue:
[aStage
move: order unit
to: order unitPosition
coast: order coast]! !
DOrderDecision subclass: #DDisbandDecision
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DDisbandDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:12'!
isDisbandDecision
^ true! !
!DDisbandDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:09'!
shouldFail
^ false! !
!DDisbandDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:09'!
shouldSucceed
^ true! !
DOrderDecision subclass: #DDislodgeDecision
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:40'!
coast
^ order unitPosition hasCoasts ifTrue:
[order stage occupiedCoastOf: order unitPosition]! !
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:11'!
isDislodgeDecision
^ true! !
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:39'!
moveDecision
^ order isMove ifTrue: [judge decisions detect: [:ea | ea isMoveDecision and: [ea order = order]]]! !
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:59'!
opposingMoves
^ judge decisions select: [:ea | ea isMoveDecision and: [ea target = order unitPosition]]! !
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:29'!
shouldFail
^ (self moveDecision notNil and: [self moveDecision isSuccessful])
or: [self opposingMoves allSatisfy: [:ea | ea isFailure]]! !
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:08'!
shouldSucceed
^ (self opposingMoves anySatisfy: [:ea | ea isSuccessful])
and: [self moveDecision isNil or: [self moveDecision isFailure]]! !
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:15'!
unit
^ order unit! !
!DDislodgeDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:39'!
updateStage: aStage
(self moveDecision notNil and: [self moveDecision isSuccessful]) ifFalse:
[self isSuccessful ifFalse:
[aStage
move: self unit
to: order unitPosition
coast: self coast]].
self isSuccessful ifTrue:
[aStage addRetreat: self unit from: self unitPosition]! !
DOrderDecision subclass: #DMoveDecision
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:51'!
attackStrength
^ judge decisions detect: [:ea | ea isAttackStrength and: [ea move = order]]! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:10'!
isHeadToHead
^ judge decisions anySatisfy:
[:ea |
ea isMoveDecision
and: [ea order isHeadToHeadWith: order]]! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:39'!
isMoveDecision
^ true! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 00:42'!
move
^ order! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 5/28/2008 17:35'!
opposingDefendStrength
^ judge decisions detect: [:ea | ea isDefendStrength and: [ea unitPosition = order target]] ifNone: []! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:00'!
opposingHoldStrength
^ judge decisions detect: [:ea | ea isHoldStrength and: [ea place = order target]]! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:00'!
opposingPreventStrengths
^ judge decisions select:
[:ea |
ea isPreventStrength
and: [ea move ~= order]
and: [ea target = order target]]! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:03'!
shouldFail
^ (self isHeadToHead
ifTrue: [self attackStrength max <= self opposingDefendStrength min]
ifFalse: [self attackStrength max <= self opposingHoldStrength min])
or: [self opposingPreventStrengths anySatisfy: [:ea | self attackStrength max <= ea min]]! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:04'!
shouldSucceed
^ (self isHeadToHead
ifTrue: [self attackStrength min > self opposingDefendStrength max]
ifFalse: [self attackStrength min > self opposingHoldStrength max])
and: [self opposingPreventStrengths allSatisfy: [:ea | self attackStrength min > ea max]]! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:00'!
target
^ order target! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:38'!
updateStage: aStage
self isSuccessful ifTrue:
[aStage
move: order unit
to: order target
coast: order coast]! !
!DMoveDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:23'!
viewerClass
^ DMoveDecisionViewer! !
!DOrderDecision class methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:28'!
order: anOrder
^ self basicNew setOrder: anOrder! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:14'!
= other
^ self species = other species and: [self order = other order]! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:45'!
isDecided
^ succeeds notNil! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:06'!
isFailure
^ self isDecided and: [self isSuccessful not]! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 04:07'!
isOrderDecision
^ true! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:46'!
isSuccessful
^ self isDecided and: [succeeds]! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:14'!
order
^ order! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:07'!
power
^ order unit power! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:14'!
setOrder: anOrder
order := anOrder! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:56'!
unitPosition
^ order unitPosition! !
!DOrderDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:36'!
update
self isDecided ifFalse:
[self shouldSucceed
ifTrue: [succeeds := true. ^ true]
ifFalse: [self shouldFail ifTrue: [succeeds := false. ^ true]]].
^ false! !
DOrderDecision subclass: #DPathDecision
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DPathDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:09'!
convoyMapWithOrders: aCollection
^ DConvoyMapBuilder
sources: (Array with: order unitPosition)
targets: (Array with: order target)
fleets: (aCollection collect: [:ea | ea unitPosition])! !
!DPathDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:34'!
convoyOrdersWhereDislodge: aBlock
^ (judge decisions select:
[:ea |
ea isDislodgeDecision
and: [aBlock value: ea]
and: [ea order isConvoy]
and: [ea order convoyedOrder = order]])
collect: [:ea | ea order]! !
!DPathDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:33'!
definiteConvoyOrders
^ self convoyOrdersWhereDislodge: [:ea | ea isFailure]! !
!DPathDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:26'!
isPathDecision
^ true! !
!DPathDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:33'!
possibleConvoyOrders
^ self convoyOrdersWhereDislodge: [:ea | ea isSuccessful not]! !
!DPathDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:32'!
shouldFail
order canMoveToTarget ifTrue: [^ false].
^ (self convoyMapWithOrders: self possibleConvoyOrders) hasRoute not! !
!DPathDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 23:38'!
shouldSucceed
order canMoveToTarget ifTrue: [^ true].
^ (self convoyMapWithOrders: self definiteConvoyOrders) hasRoute! !
DOrderDecision subclass: #DRetreatDecision
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DRetreatDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:50'!
isRetreatDecision
^ true! !
!DRetreatDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 15:01'!
opposingRetreats
^ judge decisions select:
[:ea |
ea isRetreatDecision
and: [ea ~= self]
and: [ea order target = self order target]]! !
!DRetreatDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:51'!
shouldFail
^ self opposingRetreats isEmpty not! !
!DRetreatDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:51'!
shouldSucceed
^ self opposingRetreats isEmpty! !
!DRetreatDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:38'!
updateStage: aStage
self isSuccessful ifTrue:
[aStage
move: order unit
to: order target
coast: order coast]! !
DOrderDecision subclass: #DSupportDecision
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DSupportDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:11'!
dislodgeDecision
^ judge decisions detect: [:ea | ea isDislodgeDecision and: [ea unit = order unit]]! !
!DSupportDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:42'!
isSupportDecision
^ true! !
!DSupportDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:58'!
opposingAttackStrengths
|all|
all := judge decisions select:
[:ea |
ea isAttackStrength and:
[ea move target = order unitPosition]].
^ self supportedOrder isMove
ifTrue: [all reject: [:ea | ea unitPosition = self supportedOrder target]]
ifFalse: [all]! !
!DSupportDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:06'!
shouldFail
^ (self opposingAttackStrengths anySatisfy: [:ea | ea min > 0])
or: [self dislodgeDecision isSuccessful]! !
!DSupportDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:06'!
shouldSucceed
^ (self opposingAttackStrengths allSatisfy: [:ea | ea max = 0])
and: [self dislodgeDecision isFailure]! !
!DSupportDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:56'!
supportedOrder
^ order supportedOrder! !
DDecision subclass: #DStrengthDecision
instanceVariableNames: 'min max'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
DStrengthDecision subclass: #DHoldStrength
instanceVariableNames: 'place'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DHoldStrength class methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:07'!
place: aPlace
^ self new setPlace: aPlace! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:06'!
= other
^ self species = other species and: [self place = other place]! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:15'!
allSupports
^ judge decisions select:
[:ea |
ea isSupportDecision
and: [ea supportedOrder isHold]
and: [ea supportedOrder unitPosition = place]]! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:29'!
calculateMax
^ self isPlaceEmpty
ifTrue: [0]
ifFalse:
[self moveOrder
ifNil: [1 + self possibleSupports size]
ifNotNilDo:
[:mv |
mv isSuccessful
ifTrue: [0]
ifFalse: [1]]]! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:28'!
calculateMin
^ self isPlaceEmpty
ifTrue: [0]
ifFalse:
[self moveOrder
ifNil: [1 + self successfulSupports size]
ifNotNilDo:
[:mv |
mv isFailure
ifTrue: [1]
ifFalse: [0]]]! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isHoldStrength
^true! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:15'!
isPlaceEmpty
^ judge decisions noneSatisfy: [:ea | ea isOrderDecision and: [ea unitPosition = place]]! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:16'!
moveOrder
^ judge decisions detect: [:ea | ea isMoveDecision and: [ea unitPosition = place]] ifNone: []! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:07'!
place
^ place! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 23:04'!
power
^ nil! !
!DHoldStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:07'!
setPlace: aPlace
place := aPlace! !
DStrengthDecision subclass: #DMoveStrength
instanceVariableNames: 'move'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
DMoveStrength subclass: #DAttackStrength
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DAttackStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:03'!
attackedUnitWhereMove: aBlock
self
decisionWhere: [:ea | ea isMoveDecision and: [ea order isHeadToHeadWith: move]]
unitDo: [:u | ^ u].
self
decisionWhere: [:ea | ea isDislodgeDecision and: [ea unitPosition = move target] and: [ea order isHold]]
unitDo: [:u | ^ u].
self
decisionWhere: [:ea | ea isMoveDecision and: [ea unitPosition = move target] and: [aBlock value: ea]]
unitDo: [:u | ^ u].
^ nil! !
!DAttackStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:34'!
calculateMax
self pathDecision isFailure ifTrue: [^ 0].
^ (self attackedUnitWhereMove: [:ea | ea isFailure])
ifNil: [1 + self possibleSupports size]
ifNotNilDo:
[:unit |
unit power = move unit power
ifTrue: [0]
ifFalse: [1 + (self possibleSupports reject: [:ea | ea order unit power = unit power]) size]]! !
!DAttackStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:35'!
calculateMin
self pathDecision isSuccessful ifFalse: [^ 0].
^ (self attackedUnitWhereMove: [:ea | ea isSuccessful not])
ifNil: [1 + self successfulSupports size]
ifNotNilDo:
[:unit |
unit power = move unit power
ifTrue: [0]
ifFalse: [1 + (self successfulSupports reject: [:ea | ea order unit power = unit power]) size]]! !
!DAttackStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:14'!
decisionWhere: selectBlock unitDo: doBlock
| decision |
decision := judge decisions detect: selectBlock ifNone: [^ self].
^ doBlock value: decision order unit
! !
!DAttackStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isAttackStrength
^true! !
DMoveStrength subclass: #DDefendStrength
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DDefendStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:08'!
calculateMax
^ 1 + self possibleSupports size! !
!DDefendStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:08'!
calculateMin
^ 1 + self successfulSupports size! !
!DDefendStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isDefendStrength
^true! !
!DMoveStrength class methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:16'!
move: aMove
^ self new setMove: aMove! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:21'!
= other
^ self species = other species and: [self move = other move]! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:56'!
allSupports
^ judge decisions select: [:ea | ea isSupportDecision and: [ea supportedOrder = move]]! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:21'!
move
^ move! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:36'!
pathDecision
^ judge decisions detect: [:ea | ea isPathDecision and: [ea order = self move]]! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:07'!
power
^ move unit power! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:15'!
setMove: aMove
move := aMove! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:00'!
target
^ move target! !
!DMoveStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:57'!
unitPosition
^ move unitPosition! !
DMoveStrength subclass: #DPreventStrength
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DPreventStrength class methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:16'!
move: aMove
^ self new setMove: aMove! !
!DPreventStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:36'!
calculateMax
self pathDecision isFailure ifTrue: [^ 0].
^ (self isHeadToHead and: [self opposingMove isSuccessful])
ifTrue: [0]
ifFalse: [1 + self possibleSupports size]! !
!DPreventStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:36'!
calculateMin
self pathDecision isSuccessful ifFalse: [^ 0].
^ (self isHeadToHead and: [self opposingMove isFailure not])
ifTrue: [0]
ifFalse: [1 + self successfulSupports size]! !
!DPreventStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:12'!
isHeadToHead
^ judge decisions anySatisfy:
[:ea |
ea isMoveDecision
and: [ea order isHeadToHeadWith: move]]! !
!DPreventStrength methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:53'!
isPreventStrength
^true! !
!DPreventStrength methodsFor: 'as yet unclassified' stamp: 'avi 5/28/2008 17:40'!
opposingMove
^ judge decisions detect:
[:ea |
ea isMoveDecision
and: [ea order isHeadToHeadWith: move]]! !
!DStrengthDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:07'!
initialize
min := 0.
max := 100! !
!DStrengthDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:44'!
max
^ max! !
!DStrengthDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:44'!
min
^ min! !
!DStrengthDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:43'!
possibleSupports
^ self allSupports select: [:ea | ea isFailure not]! !
!DStrengthDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:43'!
successfulSupports
^ self allSupports select: [:ea | ea isSuccessful]! !
!DStrengthDecision methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:37'!
update
| oldMax oldMin |
oldMax := max.
oldMin := min.
max := self calculateMax.
min := self calculateMin.
^ {max. min} ~= {oldMax. oldMin}! !
Object subclass: #DDecisionViewer
instanceVariableNames: 'decision'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
DDecisionViewer subclass: #DBlankDecisionViewer
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DBlankDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 15:38'!
renderOn: html! !
DDecisionViewer subclass: #DBuildDecisionViewer
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DBuildDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:25'!
renderItemOn: html
html text: 'Build '.
html text: decision order unit typeName.
html text: ' at '.
html text: decision order unitPosition name.
self renderSuccessOn: html! !
!DDecisionViewer class methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 15:19'!
decision: aDecision
^ self basicNew setDecision: aDecision! !
!DDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 21:35'!
renderMove: aMove on: html
html emphasis class: 'start'; with: aMove unitPosition name.
html space.
html image
resourceUrl: 'img/forward.png';
altText: '->';
width: 10;
height: 10.
html space.
html emphasis class: 'end'; with: aMove target name! !
!DDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 17:22'!
renderOn: html
html listItem class: decision power id; with: [self renderItemOn: html]! !
!DDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:05'!
renderStrength: aStrength on: html
html text: ' (', aStrength max asString, ')'! !
!DDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 21:35'!
renderSuccessOn: html
decision isSuccessful
ifFalse: [html emphasis class: 'resultFailure'; with: ' (Failed)'].! !
!DDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 17:21'!
setDecision: aDecision
decision := aDecision! !
DDecisionViewer subclass: #DDisbandDecisionViewer
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DDisbandDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:25'!
renderItemOn: html
html text: 'Disbanded: ', decision order unitPosition name! !
DDecisionViewer subclass: #DMoveDecisionViewer
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DMoveDecisionViewer class methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 00:48'!
moveDecision: aMoveDecision
^ self basicNew setMoveDecision: aMoveDecision! !
!DMoveDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 15:40'!
renderAttackOn: html
html unorderedList:
[decision attackStrength allSupports do:
[:ea |
html listItem: [self renderSupport: ea on: html]]]! !
!DMoveDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 15:40'!
renderHoldOn: html
| hold |
hold := decision opposingHoldStrength.
hold moveOrder
ifNil: [hold allSupports isEmpty
ifTrue: [html heading level: 5; with: 'Against Hold']
ifFalse:
[html heading level: 5; with: 'Against Supported Hold (', hold max asString, ')'.
html unorderedList:
[hold allSupports do:
[:ea |
html listItem: [self renderSupport: ea on: html]]]]]
ifNotNilDo:
[:mv |
mv isSuccessful ifFalse:
[html heading level: 5; with:
[html text: 'Against Failed Move: '.
self renderMove: mv on: html]]]! !
!DMoveDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:06'!
renderItemOn: html
self renderMove: decision move on: html.
self renderSuccessOn: html.
decision attackStrength allSupports isEmpty ifFalse:
[html heading level: 5; with:
[html text: 'Support'.
self renderStrength: decision attackStrength on: html].
self renderAttackOn: html].
decision opposingHoldStrength isPlaceEmpty ifFalse:
[self renderHoldOn: html].
decision opposingPreventStrengths do:
[:ea |
html heading level: 5; with:
[html text: 'Against '.
self renderPrevent: ea on: html]]! !
!DMoveDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 16:05'!
renderPrevent: aPreventStrength on: html
self renderMove: aPreventStrength move on: html.
self renderStrength: aPreventStrength on: html! !
!DMoveDecisionViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/12/2008 15:07'!
renderSupport: aSupportDecision on: html
html text: aSupportDecision unitPosition name.
aSupportDecision isFailure ifTrue:
[html break.
html emphasis class: 'cut'; with:
[html text: '(cut by '.
self renderMove:
(aSupportDecision opposingAttackStrengths detect: [:ea | ea max > 0] ifNone: [^ html text: 'ERROR)']) move
on: html.
html text: ')']]! !
Object subclass: #DGame
instanceVariableNames: 'name map stages users token deadline duration timeouts inTimeout'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Users'!
!DGame class methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 01:05'!
map: aMap
^ self basicNew setMap: aMap! !
!DGame class methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 01:06'!
new
^ self map: DStandardMap new! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:02'!
addUser: aUser
(self allUsers includes: aUser) ifFalse: [users at: aUser put: self randomPower]! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 5/8/2008 13:24'!
advanceTurn
self tryToAdvance.
deadline := self nextDeadline! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:21'!
allUsers
^ users keys! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/10/2008 21:05'!
canStart
^ self allUsers size = self map powers size! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 17:19'!
clearTimeout
inTimeout := false! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 2/1/2009 22:54'!
currentStage
|shouldSave|
shouldSave := false.
self isAbandoned ifFalse:
[[self deadline < DateAndTime now] whileTrue:
[self advanceTurn.
shouldSave := true].
shouldSave ifTrue: [self save]].
^ self stages last! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/22/2008 17:45'!
deadline
^ deadline ifNil: [deadline := self firstDeadline]! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 5/7/2008 01:40'!
deadline: aDateAndTime
deadline := aDateAndTime! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/22/2008 17:45'!
firstDeadline
^ DateAndTime now + self stageDuration! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 2/1/2009 22:52'!
isAbandoned
^ (DateAndTime now - self deadline) / self stageDuration > 20! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 17:17'!
isInTimeout
^ inTimeout ifNil: [false]! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:19'!
map
^ map! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 01:05'!
name
^ name ifNil:
[String streamContents:
[:s |
self allUsers
do: [:ea | s nextPutAll: ea name]
separatedBy: [s nextPutAll: ', ']]]! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 01:06'!
name: aString
name := aString! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/22/2008 17:44'!
nextDeadline
^ deadline + self stageDuration! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 02:03'!
nextStage
^ stages addLast: (DStage new fromPreviousStage: self stages last)! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 01:00'!
powerForUser: aUser
^ users at: aUser! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:26'!
randomPower
^ (map powers difference: users values) atRandom! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/21/2008 17:59'!
replaceUser: aUser with: otherUser
users at: otherUser put: (self powerForUser: aUser).
users removeKey: aUser! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 2/1/2009 22:54'!
save
DDatabase default saveGame: self! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/22/2008 17:45'!
setMap: aMap
map := aMap.
stages := OrderedCollection with: map firstStage.
users := Dictionary new.
deadline := self firstDeadline! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/12/2008 00:08'!
stageDuration
^ duration ifNil: [24 hours]! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/22/2008 17:45'!
stageDuration: aDuration
duration := aDuration.
deadline := self firstDeadline! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:16'!
stages
^ stages! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 17:19'!
startTimeout
self stages last powersWithoutOrders do:
[:ea |
timeouts at: ea put: (((self timeoutsForPower: ea) - 1) max: 0)].
inTimeout := true! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 02:06'!
timeLeft
^ deadline - DateAndTime now! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 02:16'!
timeoutsForPower: aPower
timeouts ifNil: [timeouts := Dictionary new].
^ timeouts at: aPower ifAbsent: [10]! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/10/2008 21:22'!
token
^ token ifNil: [token := WAExternalID new asString].! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 17:18'!
tryToAdvance
self isInTimeout ifTrue:
[self clearTimeout.
^ self nextStage].
(self stages last powersWithoutOrders anySatisfy:
[:ea |
(self timeoutsForPower: ea) > 0])
ifFalse: [^ self nextStage].
self startTimeout.! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:33'!
userForPower: aPower
users keysAndValuesDo:
[:k :v |
v = aPower ifTrue: [^ k]].
^ nil! !
!DGame methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 23:05'!
userMap
|dict p|
dict := Dictionary new.
map powers do:
[:ea |
p := Dictionary new.
p at: 'timeouts' put: (self timeoutsForPower: p).
(self userForPower: ea) ifNotNilDo:
[:u |
p at: 'user' put: u email].
dict at: ea id put: p].
^ dict! !
Object subclass: #DJudge
instanceVariableNames: 'decisions'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Judge'!
!DJudge class methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 00:19'!
decisionsForOrders: aCollection
^ self new
addOrders: aCollection;
makeDecisions;
decisions! !
!DJudge methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:23'!
addDecision: aDecision
self decisions addIfNotPresent: aDecision.
aDecision setJudge: self! !
!DJudge methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:19'!
addOrders: aCollection
aCollection do: [:ea | ea addDecisionsTo: self]! !
!DJudge methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 15:23'!
decisions
^ decisions ifNil: [decisions := OrderedCollection new]! !
!DJudge methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:38'!
makeDecisions
[self tryMakingDecisions] whileTrue! !
!DJudge methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:38'!
tryMakingDecisions
|decisionMade|
decisionMade := false.
self decisions do: [:ea | ea update ifTrue: [decisionMade := true]].
^ decisionMade! !
Object subclass: #DMap
instanceVariableNames: 'places powers'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:17'!
initialize
places := OrderedCollection new.
powers := OrderedCollection new! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 17:37'!
landNamed: aString
^ self placeNamed: aString ifAbsentPut: [DLand name: aString]! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:08'!
placeNamed: aString
^ places detect: [:ea | ea name = aString] ifNone: []! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 17:37'!
placeNamed: aString ifAbsentPut: aBlock
^ places detect: [:ea | ea name = aString] ifNone: [places addLast: aBlock value]! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:28'!
places
^ places! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 17:38'!
powerNamed: aString
^ powers detect: [:ea | ea name = aString] ifNone: [powers addLast: (DPower name: aString)]! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:27'!
powers
^ powers! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 17:38'!
seaNamed: aString
^ self placeNamed: aString ifAbsentPut: [DSea name: aString]! !
!DMap methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:58'!
supplyCenterNamed: aString
^ self placeNamed: aString ifAbsentPut: [DSupplyCenter name: aString]! !
DMap subclass: #DStandardMap
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 10:41'!
buildMap
| placeAbbrevs place |
placeAbbrevs := Dictionary new.
self nonSupplyLandNames do:
[:ea |
placeAbbrevs at: ea first asLowercase put: (self landNamed: ea second)].
self supplyNames do:
[:ea |
placeAbbrevs at: ea first asLowercase put: (self supplyCenterNamed: ea second)].
self seaNames do:
[:ea |
placeAbbrevs at: ea first asLowercase put: (self seaNamed: ea second)].
self neighborList do:
[:array |
place := placeAbbrevs at: array first.
array second do: [:ea | place addNeighbor: (placeAbbrevs at: ea)]].
self northCoasts do:
[:array |
place := placeAbbrevs at: array first.
array second do: [:ea | place addNeighbor: (placeAbbrevs at: ea) coast: #north]].
self eastCoasts do:
[:array |
place := placeAbbrevs at: array first.
array second do: [:ea | place addNeighbor: (placeAbbrevs at: ea) coast: #east]].
self southCoasts do:
[:array |
place := placeAbbrevs at: array first.
array second do: [:ea | place addNeighbor: (placeAbbrevs at: ea) coast: #south]].! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 10:46'!
eastCoasts
^ #((bul (rum bla con)))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:14'!
firstStage
| stage power unit place |
stage := DStage map: self.
self startingUnits do:
[:ea |
power := self powerNamed: ea first.
ea allButFirst do:
[:array |
unit := array first = #A
ifTrue: [power buildArmy]
ifFalse: [power buildFleet].
place := self placeNamed: array second.
stage move: unit to: place coast: nil.
stage control: place with: power.
place homePower: power]].
self homeProvinces do:
[:ea |
power := self powerNamed: ea first.
ea allButFirst do:
[:p |
stage control: (self placeNamed: p) with: power]].
^ stage! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 23:38'!
homeProvinces
^
#(('England' 'Clyde' 'Yorkshire' 'Wales')
('France' 'Picardy' 'Gascony' 'Burgundy')
('Germany' 'Ruhr' 'Silesia' 'Prussia')
('Austria' 'Tyrolia' 'Bohemia' 'Galicia')
('Italy' 'Apulia' 'Tuscany' 'Piedmont')
('Turkey' 'Armenia' 'Syria')
('Russia' 'Ukraine' 'Livonia' 'Finland'))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 17:53'!
initialize
super initialize.
self buildMap! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 17:56'!
landNames
^
#(('Alb' 'Albania')
('Ank' 'Ankara')
('Apu' 'Apulia')
('Arm' 'Armenia')
('Bel' 'Belgium')
('Ber' 'Berlin')
('Boh' 'Bohemia')
('Bre' 'Brest')
('Bud' 'Budapest')
('Bul' 'Bulgaria')
('Bur' 'Burgundy')
('Cly' 'Clyde')
('Con' 'Constantinople')
('Den' 'Denmark')
('Edi' 'Edinburgh')
('Fin' 'Finland')
('Gal' 'Galicia')
('Gas' 'Gascony')
('Gre' 'Greece')
('Hol' 'Holland')
('Kie' 'Kiel')
('Lvp' 'Liverpool')
('Lvn' 'Livonia')
('Lon' 'London')
('Mar' 'Marseilles')
('Mos' 'Moscow')
('Mun' 'Munich')
('Nap' 'Naples')
('Naf' 'North Africa')
('Nwy' 'Norway')
('Par' 'Paris')
('Pic' 'Picardy')
('Pie' 'Piedmont')
('Por' 'Portugal')
('Pru' 'Prussia')
('Rom' 'Rome')
('Ruh' 'Ruhr')
('Rum' 'Rumania')
('Ser' 'Serbia')
('Sev' 'Sevastopol')
('Sil' 'Silesia')
('Smy' 'Smyrna')
('Spa' 'Spain')
('Stp' 'St. Petersburg')
('Swe' 'Sweden')
('Syr' 'Syria')
('Tri' 'Trieste')
('Tun' 'Tunis')
('Tus' 'Tuscany')
('Trl' 'Tyrolia')
('Ukr' 'Ukraine')
('Ven' 'Venice')
('Vie' 'Vienna')
('Wal' 'Wales')
('War' 'Warsaw')
('Yor' 'Yorkshire'))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:02'!
neighborList
^
#((ukr (rum gal mos war sev))
(wes (naf lyo mao tys tun spa))
(wal (iri lvp eng yor lon))
(eas (ion syr aeg smy))
(spa (por lyo mao wes gas mar))
(cly (nao edi lvp nwg))
(bur (pic bel par mun ruh gas mar))
(nao (iri cly mao lvp nwg))
(bot (fin lvn swe bal stp))
(nwy (fin bar nth swe ska stp nwg))
(bud (rum tri gal ser vie))
(aeg (gre bul ion eas smy con))
(yor (nth lvp wal edi lon))
(pie (lyo tus trl ven mar))
(adr (tri apu alb ion ven))
(bla (rum ank bul sev arm con))
(par (gas pic bre bur))
(ser (rum tri gre bul bud alb))
(smy (syr ank eas arm aeg con))
(rom (nap tus apu tys ven))
(mos (ukr lvn war sev stp))
(gas (spa par bur mao bre mar))
(stp (fin lvn mos nwy bar bot))
(gal (rum ukr bud war vie boh sil))
(lvn (stp bot mos war bal pru))
(ion (nap gre eas aeg tun adr apu alb tys))
(alb (tri gre adr ser ion))
(sev (rum bla ukr mos arm))
(bar (nwy stp nwg))
(tus (pie lyo tys ven rom))
(nap (apu ion tys rom))
(rum (bla ukr gal ser sev bud bul))
(ber (sil mun kie bal pru))
(ank (bla arm smy con))
(bul (rum bla gre ser aeg con))
(mun (trl ber bur ruh kie boh sil))
(nth (nwy den hol yor edi nwg eng bel ska hel lon))
(por (mao spa))
(tys (nap tus lyo wes ion tun rom))
(hel (hol kie nth den))
(ven (pie tri tus adr apu trl rom))
(iri (lvp mao nao wal eng))
(gre (bul ser alb aeg ion))
(den (nth swe kie ska bal hel))
(kie (ber den mun ruh hol hel bal))
(con (bla ank bul aeg smy))
(naf (wes tun mao))
(sil (ber gal mun war pru boh))
(lyo (spa pie tus wes tys mar))
(pic (bel par bur eng bre))
(hol (bel nth kie ruh hel))
(bal (ber lvn den swe kie pru bot))
(nwg (nth cly nao nwy edi bar))
(bel (pic nth bur hol ruh eng))
(apu (nap adr ion ven rom))
(war (lvn mos ukr gal pru sil))
(boh (gal mun trl vie sil))
(lon (wal yor nth eng))
(swe (fin nwy den ska bot bal))
(edi (nth lvp cly yor nwg))
(eng (iri bel nth mao wal pic lon bre))
(mar (pie lyo bur gas spa))
(fin (nwy bot stp swe))
(pru (ber lvn war bal sil))
(trl (pie tri mun vie ven boh))
(bre (pic par mao eng gas))
(lvp (iri cly wal nao edi yor))
(tun (naf ion tys wes))
(syr (eas arm smy))
(tri (adr bud ser alb trl vie ven))
(mao (iri por wes eng gas spa naf nao bre))
(ruh (bel hol mun kie bur))
(arm (syr bla ank sev smy))
(ska (den swe nth nwy))
(vie (tri gal bud trl boh)))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:57'!
nonSupplyLandNames
^ self landNames difference: self supplyNames! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 10:40'!
northCoasts
^
#((spa (por mao gas))
(stp (nwy bar)))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 17:24'!
seaNames
^
#(('Adr' 'Adriatic Sea')
('Aeg' 'Aegean Sea')
('Bal' 'Baltic Sea')
('Bar' 'Barents Sea')
('Bla' 'Black Sea')
('Eas' 'Eastern Mediterranean')
('Eng' 'English Channel')
('Bot' 'Gulf of Bothnia')
('Lyo' 'Gulf of Lyon')
('Hel' 'Helgoland Bight')
('Ion' 'Ionian Sea')
('Iri' 'Irish Sea')
('Mao' 'Mid-Atlantic Ocean')
('Nao' 'North Atlantic Ocean')
('Nth' 'North Sea')
('Nwg' 'Norwegian Sea')
('Ska' 'Skagerrak')
('Tys' 'Tyrrhenian Sea')
('Wes' 'Western Mediterranean'))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:15'!
southCoasts
^
#((spa (por lyo mao wes mar))
(stp (fin lvn bot))
(bul (gre aeg con)))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:19'!
startingUnits
^
#(('England' (A 'Liverpool') (F 'Edinburgh') (F 'London'))
('France' (A 'Paris') (A 'Marseilles') (F 'Brest'))
('Germany' (A 'Munich') (A 'Berlin') (F 'Kiel'))
('Italy' (A 'Venice') (A 'Rome') (F 'Naples'))
('Austria' (A 'Vienna') (A 'Budapest') (F 'Trieste'))
('Russia' (A 'Moscow') (A 'Warsaw') (F 'St. Petersburg') (F 'Sevastopol'))
('Turkey' (A 'Constantinople') (A 'Smyrna') (F 'Ankara')))! !
!DStandardMap methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:56'!
supplyNames
^
#(('Ank' 'Ankara')
('Bel' 'Belgium')
('Ber' 'Berlin')
('Bre' 'Brest')
('Bud' 'Budapest')
('Bul' 'Bulgaria')
('Con' 'Constantinople')
('Den' 'Denmark')
('Edi' 'Edinburgh')
('Gre' 'Greece')
('Hol' 'Holland')
('Kie' 'Kiel')
('Lvp' 'Liverpool')
('Lon' 'London')
('Mar' 'Marseilles')
('Mos' 'Moscow')
('Mun' 'Munich')
('Nap' 'Naples')
('Nwy' 'Norway')
('Par' 'Paris')
('Por' 'Portugal')
('Rom' 'Rome')
('Rum' 'Rumania')
('Ser' 'Serbia')
('Sev' 'Sevastopol')
('Smy' 'Smyrna')
('Spa' 'Spain')
('Stp' 'St. Petersburg')
('Swe' 'Sweden')
('Tri' 'Trieste')
('Tun' 'Tunis')
('Ven' 'Venice')
('Vie' 'Vienna')
('War' 'Warsaw'))! !
Object subclass: #DMapViewer
instanceVariableNames: 'stage power'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DMapViewer class methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:00'!
stage: aStage power: aPower
^ self basicNew setStage: aStage power: aPower! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:22'!
divFor: aPlace on: html
^ html div id: aPlace id! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:11'!
numColorDivs
^ 5! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:21'!
renderFactory: aPower on: html
aPower = power ifFalse: [^ self].
html image
resourceUrl: 'img/build/', aPower name asLowercase, '.png';
altText: '';
width: 41;
height: 42;
class: 'build'! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:12'!
renderImagesOn: html
html image
id: 'map';
resourceUrl: 'img/map.png'.
html image
id: 'mapNames';
resourceUrl: 'img/names.png'.
! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:12'!
renderOn: html
self renderImagesOn: html.
self renderPlacesOn: html! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 20:01'!
renderPlace: aPlace on: html
| pow unit canBuild coast |
pow := self stage controllingPowerFor: aPlace.
unit := self stage unitAt: aPlace.
canBuild := self stage isBuildStage and: [self stage canBuildAt: aPlace].
coast := aPlace hasCoasts ifTrue: [self stage occupiedCoastOf: aPlace].
(self divFor: aPlace on: html)
class: 'territory';
class: aPlace typeName;
class: (pow ifNil: [''] ifNotNil: [pow name asLowercase]);
class: (canBuild ifFalse: [''] ifTrue: [aPlace isWaterfront ifTrue: ['buildAny'] ifFalse: ['buildArmy']]);
with:
[(1 to: self numColorDivs) do: [:i | html div class: 'color'; id: 'color', i asString].
unit ifNotNil: [self renderUnit: unit coast: coast on: html].
canBuild ifTrue: [self renderFactory: pow on: html].
(self stage retreatingUnitAt: aPlace) ifNotNilDo: [: u | self renderRetreatingUnit: u on: html]]
! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:14'!
renderPlacesOn: html
html div class: 'territories'; with:
[self stage map places do:
[:ea |
self renderPlace: ea on: html]]! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:04'!
renderRetreatingUnit: unit on: html
html image
resourceUrl: 'img/', unit typeName, '/', unit power name asLowercase, '.png';
altText: '';
width: unit imageWidth;
height: unit imageHeight;
class: unit typeName;
class: 'retreating'! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:04'!
renderUnit: unit coast: aSymbol on: html
html image
resourceUrl: 'img/', unit typeName, '/', unit power name asLowercase, '.png';
altText: '';
width: unit imageWidth;
height: unit imageHeight;
class: unit typeName;
class: (aSymbol ifNil: [''] ifNotNil: [aSymbol, 'Coast'])! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 11:59'!
setStage: aStage power: aPower
stage := aStage.
power := aPower! !
!DMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:10'!
stage
^ stage! !
DMapViewer subclass: #DMiniMapViewer
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DMiniMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:22'!
divFor: aPlace on: html
^ html div class: aPlace id! !
!DMiniMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:19'!
numColorDivs
^ 1! !
!DMiniMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:19'!
renderFactory: aPower on: html! !
!DMiniMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:20'!
renderImagesOn: html
html image
class: 'miniMap';
resourceUrl: 'img/mapMini.png';
width: 94;
height: 94.! !
!DMiniMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:19'!
renderRetreatingUnit: unit on: html! !
!DMiniMapViewer methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 00:19'!
renderUnit: unit coast: aSymbol on: html! !
Object subclass: #DMenuViewer
instanceVariableNames: 'stage power'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DMenuViewer class methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:22'!
stage: aStage power: aPower
^ self basicNew setStage: aStage power: aPower! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 13:59'!
buildSpecs
^ #((build
(Army left)
(Fleet right)))! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 14:00'!
coastSpecs
^ #((coast
(North top)
(East right)
(South bottom)
(West left)))! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:26'!
disbandSpecs
^ #((disband
(Disband top)))! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 18:42'!
moveSpecs
^ #((army
(Move left)
(Support top)
(Hold right))
(fleet
(Move left)
(Support top)
(Hold right)
(Convoy bottom))
(support
(Move left)
(Hold right)))! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 14:03'!
renderMenuItem: aString position: posString prefix: prefixString on: html
| id |
html listItem class: posString; with:
[prefixString = 'coast' ifTrue:
[id := aString asLowercase, 'CoastButton']
ifFalse:
[id := prefixString, aString, 'Button'].
html anchor
url: 'javascript:void';
id: id;
with: aString]! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:23'!
renderOn: html
self renderSpecs: self coastSpecs on: html.
stage isRetreatStage ifTrue: [^ self renderSpecs: self retreatSpecs on: html].
stage isBuildStage ifTrue:
[(stage buildDeltaForPower: power) < 0 ifTrue: [^ self renderSpecs: self disbandSpecs on: html].
^ self renderSpecs: self buildSpecs on: html].
self renderSpecs: self moveSpecs on: html! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 23:56'!
renderSpecs: anArray on: html
| prefix |
anArray do:
[:ea |
prefix := ea first.
html div class: 'menu'; id: prefix, 'Menu'; style: 'display: none'; with:
[(#(fleet army) includes: prefix) ifFalse:
[html heading level: 4; with: prefix capitalized].
html unorderedList:
[ea allButFirst do:
[:s |
self renderMenuItem: s first position: s second prefix: prefix on: html]]]]! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 18:41'!
retreatSpecs
^ #((retreat
(Move left)
(Disband top)))! !
!DMenuViewer methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:24'!
setStage: aStage power: aPower
stage := aStage.
power := aPower! !
Object subclass: #DOrder
instanceVariableNames: 'unit stage'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
DOrder subclass: #DBuildOrder
instanceVariableNames: 'place coast'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:48'!
addDecisionsTo: aJudge
aJudge addDecision: (DBuildDecision order: self)! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:31'!
asArray
| array |
array := #('build') copyWith: unit typeName.
coast ifNotNil: [array := array copyWith: coast].
^ array! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 15:21'!
coast
^ place hasCoasts ifTrue: [coast ifNil: [#south]]! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 15:21'!
coast: aSymbol
coast := aSymbol asSymbol! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/19/2008 02:10'!
isBuild
^ true! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:53'!
isValid
^ true! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:49'!
place: aPlace
place := aPlace! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:46'!
power
^ unit power! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:37'!
target
^ place! !
!DBuildOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:46'!
unitPosition
^ place! !
DOrder subclass: #DDisbandOrder
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DDisbandOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:10'!
addDecisionsTo: aJudge
aJudge addDecision: (DDisbandDecision order: self)! !
!DDisbandOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:36'!
asArray
^ #('disband')! !
!DDisbandOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/19/2008 02:10'!
isDisband
^ true! !
!DDisbandOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:12'!
isValid
^ true! !
DOrder subclass: #DHoldOrder
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
DHoldOrder subclass: #DConvoyOrder
instanceVariableNames: 'order'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DConvoyOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:19'!
= other
^ super = other and: [self convoyedOrder = other convoyedOrder]! !
!DConvoyOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:35'!
asArray
^ #('convoy') copyWith: order asDictionary! !
!DConvoyOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:19'!
convoyedOrder
^ order! !
!DConvoyOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:19'!
convoyedOrder: anOrder
order := anOrder! !
!DConvoyOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:24'!
isConvoy
^ true! !
!DConvoyOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:19'!
isValid
^ true! !
!DConvoyOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:19'!
typeName
^ 'convoy'! !
!DHoldOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:31'!
asArray
^ #('hold')! !
!DHoldOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:11'!
isHold
^ true! !
!DHoldOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 04:10'!
isValid
^ true! !
!DHoldOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 19:12'!
printExtraOn: aStream
aStream nextPutAll: self unitPosition name! !
!DHoldOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 21:46'!
typeName
^ 'hold'! !
DHoldOrder subclass: #DSupportOrder
instanceVariableNames: 'order'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:18'!
= other
^ super = other and: [self supportedOrder = other supportedOrder]! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 03:53'!
addDecisionsTo: aJudge
super addDecisionsTo: aJudge.
aJudge addDecision: (DSupportDecision order: self)! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:35'!
asArray
^ #('support') copyWith: order asDictionary! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:11'!
isSupport
^ true! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/23/2008 18:21'!
isValid
order isMove ifTrue: [^ self unitCanMoveTo: order target].
order isHold ifTrue: [^ self unitCanMoveTo: order unitPosition].
^ false! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 19:12'!
printExtraOn: aStream
aStream nextPutAll: self unitPosition name, ': '.
order printOn: aStream! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 21:48'!
supportedOrder
^ order stage: stage! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:17'!
supportedOrder: anOrder
order := anOrder! !
!DSupportOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 21:47'!
typeName
^ 'support'! !
!DOrder class methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:49'!
unit: aUnit
^ self basicNew setUnit: aUnit! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:24'!
= other
^ other species = self species
and: [other unit = self unit]! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:13'!
addDecisionsTo: aJudge
aJudge addDecision: (DDislodgeDecision order: self)! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:38'!
asDictionary
^ Dictionary new
at: self unitPosition id
put: self asArray;
yourself! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:41'!
coast
^ nil! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:09'!
hash
^ unit hash! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/19/2008 02:10'!
isBuild
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:06'!
isCancel
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:24'!
isConvoy
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/19/2008 02:10'!
isDisband
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:11'!
isHold
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:50'!
isMove
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/18/2008 01:23'!
isRetreat
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:11'!
isSupport
^ false! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:30'!
jsonWriteOn: aStream
self asArray jsonWriteOn: aStream! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:35'!
power
^ unit power! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:35'!
printOn: aStream
self jsonWriteOn: aStream! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:22'!
setUnit: aUnit
unit := aUnit! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:09'!
stage
^ stage! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:55'!
stage: aStage
stage := aStage! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:22'!
unit
^ unit! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/23/2008 18:20'!
unitCanMoveTo: aPlace
^ unit canMoveTo: aPlace inStage: stage! !
!DOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:13'!
unitPosition
^ stage positionOf: unit! !
DOrder subclass: #DTargetOrder
instanceVariableNames: 'target coast'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
DTargetOrder subclass: #DMoveOrder
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:26'!
addDecisionsTo: aJudge
super addDecisionsTo: aJudge.
aJudge
addDecision: (DMoveDecision order: self);
addDecision: (DPathDecision order: self);
addDecision: (DAttackStrength move: self);
addDecision: (DPreventStrength move: self);
addDecision: (DDefendStrength move: self);
addDecision: (DHoldStrength place: self target)! !
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:33'!
asArray
|array|
array := #('move') copyWith: target id.
coast ifNotNil: [array := array copyWith: coast].
^ array! !
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 00:50'!
canBeConvoyed
^ (stage convoyMap at: self unitPosition) includes: target! !
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 15:21'!
coast
^ target hasCoasts ifTrue:
[coast ifNil: [target coastOfNeighbor: self unitPosition]]! !
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:58'!
isHeadToHeadWith: aMoveOrder
^ aMoveOrder target = self unitPosition
and: [aMoveOrder unitPosition = self target]! !
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:50'!
isMove
^ true! !
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 21:41'!
isValid
^ self canMoveToTarget or: [self canBeConvoyed]! !
!DMoveOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 21:47'!
typeName
^ 'move'! !
DTargetOrder subclass: #DRetreatOrder
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DRetreatOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:48'!
addDecisionsTo: aJudge
aJudge addDecision: (DRetreatDecision order: self)! !
!DRetreatOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 18:33'!
asArray
|array|
array := #('retreat') copyWith: target id.
coast ifNotNil: [array := array copyWith: coast].
^ array! !
!DRetreatOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 15:21'!
coast
^ target hasCoasts ifTrue:
[coast ifNil: [target coastOfNeighbor: self retreatPosition]]! !
!DRetreatOrder methodsFor: 'as yet unclassified' stamp: 'avi 4/18/2008 01:23'!
isRetreat
^ true! !
!DRetreatOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 21:41'!
isValid
self canMoveToTarget ifFalse: [^ false].
(stage unitAt: target) ifNotNil: [^ false].
(stage decisions anySatisfy:
[:ea |
ea isMoveDecision
and: [ea isSuccessful]
and: [ea move unitPosition = target]
and: [ea move target = self retreatPosition]]) ifTrue: [^ false].
(stage decisions anySatisfy:
[:ea |
ea isPreventStrength
and: [ea min > 0]
and: [ea move target = target]]) ifTrue: [^ false].
^ true! !
!DRetreatOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 15:06'!
retreatPosition
^ stage retreatPositionOf: unit! !
!DTargetOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:49'!
= other
^ super = other and: [other target = self target]! !
!DTargetOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 21:40'!
canMoveToTarget
^ self unitCanMoveTo: target! !
!DTargetOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/29/2008 15:20'!
coast: aSymbol
coast := aSymbol asSymbol! !
!DTargetOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:49'!
printExtraOn: aStream
aStream nextPutAll: self unitPosition name, ' -> ', self target name! !
!DTargetOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:49'!
target
^ target! !
!DTargetOrder methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:49'!
target: aPlace
target := aPlace! !
Object subclass: #DOrderParser
instanceVariableNames: 'stage'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-UI'!
!DOrderParser class methodsFor: 'as yet unclassified' stamp: 'avi 3/31/2008 17:35'!
parseString: aString stage: aStage
^ (self stage: aStage) parseString: aString! !
!DOrderParser class methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 19:04'!
stage: aStage
^ self basicNew setStage: aStage! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:37'!
addCoast: aSymbol to: order
(order target hasCoasts and: [aSymbol notNil]) ifTrue: [order coast: aSymbol]! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:30'!
buildAt: aPlace with: kind with: coast
|power order|
power := stage controllingPowerFor: aPlace.
order := kind = 'army'
ifTrue: [power buildArmyAt: aPlace]
ifFalse: [power buildFleetAt: aPlace].
self addCoast: coast to: order.
^ order
! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:38'!
cancelAt: place with: ignore with: ignore2
^ DCancelOrder place: place! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:36'!
convoyAt: place with: json with: ignore
|unit|
unit := stage unitAt: place.
^ unit convoyOrder: ((self ordersForJson: json) at: 1 ifAbsent: [^ nil])! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:36'!
disbandAt: place with: ignore with: ignore2
^ (stage unitAt: place) ifNotNilDo: [:u | u disband]! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:07'!
holdAt: place with: ignore with: ignore2
^ (stage unitAt: place) ifNotNilDo: [:u | u hold]! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:32'!
moveAt: place with: targetName with: coast
|unit order|
unit := stage unitAt: place.
order := unit moveTo: (self placeWithId: targetName).
self addCoast: coast to: order.
^ order! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:26'!
orderFor: anAssociation
| place orderType selector |
place := self placeWithId: anAssociation key.
orderType := anAssociation value first.
selector := (orderType, 'At:with:with:') asSymbol.
^ (self respondsTo: selector) ifTrue:
[self
perform: selector
with: place
with: (anAssociation value at: 2 ifAbsent: [])
with: (anAssociation value at: 3 ifAbsent: [])]! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 12:45'!
ordersForJson: aJson
^ ((aJson properties collect: [:ea | self orderFor: ea])
select: [:ea | ea notNil])
collect: [:ea | ea stage: stage; yourself]! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 19:03'!
parseStream: aStream
^ self ordersForJson: (Json readFrom: aStream)! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/31/2008 17:33'!
parseString: aString
^ self parseStream: aString readStream! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:12'!
placeWithId: aString
^ stage map places detect: [:ea | ea id = aString]! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:35'!
retreatAt: place with: targetName with: coast
|unit order|
unit := stage retreatingUnitAt: place.
order := unit retreatTo: (self placeWithId: targetName).
self addCoast: coast to: order.
^ order! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 19:04'!
setStage: aStage
stage := aStage! !
!DOrderParser methodsFor: 'as yet unclassified' stamp: 'avi 3/30/2008 10:34'!
supportAt: place with: json with: ignore
|unit|
unit := stage unitAt: place.
^ unit supportOrder: ((self ordersForJson: json) at: 1 ifAbsent: [^ nil])! !
Object subclass: #DPlace
instanceVariableNames: 'neighbors name'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
DPlace subclass: #DLand
instanceVariableNames: 'coasts'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:47'!
addNeighbor: aPlace coast: aSymbol
^ (coasts at: aSymbol ifAbsentPut: [Set new]) add: aPlace! !
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:00'!
coastOfNeighbor: aPlace
coasts keysAndValuesDo:
[:c :n |
(n includes: aPlace) ifTrue: [^ c]].
^ nil! !
!DLand methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 11:03'!
hasCoast: aSelector
^ coasts includesKey: aSelector! !
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:47'!
hasCoasts
^ coasts isEmpty not! !
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:01'!
isLand
^ true! !
!DLand methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 11:05'!
neighborsForCoast: aSelector
^ coasts at: aSelector! !
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:47'!
neighborsOfCoast: aSymbol
^ coasts at: aSymbol ifAbsent: [#()]! !
!DLand methodsFor: 'as yet unclassified' stamp: 'ben 6/1/2008 11:08'!
removeCoast: aSelector
coasts removeKey: aSelector! !
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:47'!
setName: aString
super setName: aString.
coasts := Dictionary new! !
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 22:20'!
typeName
^ 'land'! !
!DLand methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:59'!
updateControlFor: aStage power: aPower
aStage control: self with: aPower! !
DLand subclass: #DSupplyCenter
instanceVariableNames: 'homePower'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DSupplyCenter methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:33'!
homePower
^ homePower! !
!DSupplyCenter methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:33'!
homePower: aPower
homePower := aPower! !
!DSupplyCenter methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:15'!
isSupplyCenter
^ true! !
!DSupplyCenter methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:07'!
updateControlFor: aStage power: aPower
aStage season isFall ifTrue: [aStage control: self with: aPower]! !
!DPlace class methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:20'!
name: aString
^ self basicNew setName: aString! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:08'!
addNeighbor: aPlace
neighbors add: aPlace! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:01'!
allNeighbors
^ neighbors! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:34'!
id
^ (name asLowercase replaceAll: $ with: $-) copyWithout: $.! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:01'!
isLand
^ false! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:01'!
isSea
^ false! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:15'!
isSupplyCenter
^ false! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:04'!
isWaterfront
^ self isLand and: [self allNeighbors anySatisfy: [:ea | ea isSea]]! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 18:07'!
jsonWriteOn: aStream
self id jsonWriteOn: aStream! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 03:15'!
name
^ name! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 18:07'!
printOn: aStream
aStream nextPutAll: self id! !
!DPlace methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:19'!
setName: aString
name := aString.
neighbors := Set new! !
DPlace subclass: #DSea
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DSea methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:17'!
hasCoasts
^ false! !
!DSea methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:01'!
isSea
^ true! !
!DSea methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 22:20'!
typeName
^ 'sea'! !
!DSea methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:59'!
updateControlFor: aStage power: aPower! !
Object subclass: #DPower
instanceVariableNames: 'name'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DPower class methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 00:49'!
name: aString
^ self basicNew setName: aString! !
!DPower methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:44'!
buildArmy
^ DArmy power: self! !
!DPower methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:49'!
buildArmyAt: aPlace
^ (DBuildOrder unit: self buildArmy)
place: aPlace;
yourself! !
!DPower methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 01:44'!
buildFleet
^ DFleet power: self! !
!DPower methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:48'!
buildFleetAt: aPlace
^ (DBuildOrder unit: self buildFleet)
place: aPlace;
yourself! !
!DPower methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 15:33'!
id
^ name asLowercase! !
!DPower methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:30'!
name
^ name! !
!DPower methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 00:49'!
setName: aString
name := aString! !
Object subclass: #DSeason
instanceVariableNames: 'year'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
DSeason subclass: #DFall
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DFall methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:00'!
isFall
^ true! !
!DFall methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:29'!
next
^ DSpring year: year + 1! !
!DFall methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:33'!
typeName
^ 'Fall'! !
!DSeason class methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:29'!
year: aNumber
^ self basicNew setYear: aNumber! !
!DSeason methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:00'!
isFall
^ false! !
!DSeason methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:02'!
isSpring
^ false! !
!DSeason methodsFor: 'as yet unclassified' stamp: 'avi 3/18/2008 00:00'!
name
^ self typeName, ' ', self year asString! !
!DSeason methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:29'!
setYear: aNumber
year := aNumber! !
!DSeason methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:29'!
year
^ year! !
DSeason subclass: #DSpring
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DSpring methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:02'!
isSpring
^ true! !
!DSpring methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:30'!
next
^ DFall year: year! !
!DSpring methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:33'!
typeName
^ 'Spring'! !
Object subclass: #DStage
instanceVariableNames: 'map unitPositions coasts orders control decisions season retreats deltas'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DStage class methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:14'!
map: aMap
^ self new setMap: aMap! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:07'!
addOrder: anOrder
anOrder isCancel ifTrue: [^ self cancelOrderAt: anOrder place].
(anOrder isBuild and: [anOrder isValid]) ifTrue: [self cancelOrderAt: anOrder unitPosition].
orders at: anOrder unit put: anOrder.
anOrder stage: self! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:46'!
addRetreat: aUnit from: aPlace
self retreats at: aUnit put: aPlace! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 23:09'!
buildDeltaForPower: aPower
^ deltas at: aPower ifAbsent: [0]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:17'!
canAdvanceSeason
^ self isRetreatStage not and: [self isBuildStage not]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 23:06'!
canBuildAt: aPlace
| power |
aPlace isSupplyCenter ifFalse: [^ false].
(self unitAt: aPlace) ifNotNil: [^ false].
(power := self controllingPowerFor: aPlace) ifNil: [^ false].
power = aPlace homePower ifFalse: [^ false].
^ (self buildDeltaForPower: power) > 0! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 14:56'!
cancelOrderAt: aPlace
orders keysAndValuesDo:
[:k :v |
v unitPosition = aPlace ifTrue: [^ orders removeKey: k]]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 23:08'!
computeBuildDeltaForPower: aPower
^ ((self supplyCentersForPower: aPower) size - (self unitsForPower: aPower) size) min: (self openCentersForPower: aPower) size! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 23:33'!
control: aPlace with: aPower
control at: aPlace put: aPower! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/11/2008 13:22'!
controllingPowerFor: aPlace
aPlace isSea ifTrue: [^ nil].
^ control at: aPlace ifAbsent: []! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:12'!
convoyMap
| sources targets fleets |
sources := (self units select: [:ea | ea isArmy]) collect: [:ea | self positionOf: ea].
targets := self map places select: [:ea | ea isWaterfront].
fleets := ((self units select: [:ea | ea isFleet]) collect: [:ea | self positionOf: ea]) select: [:ea | ea isSea].
^ (DConvoyMapBuilder sources: sources targets: targets fleets: fleets) map! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 00:17'!
decisions
^ decisions ifNil: [#()]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 22:07'!
fileName
^ String streamContents:
[:s |
s nextPutAll: season year asString.
season isFall
ifTrue: [s nextPutAll: 'B']
ifFalse: [s nextPutAll: 'A'].
self isRetreatStage ifTrue:
[s nextPutAll: 'X'].
self isBuildStage ifTrue:
[s nextPutAll: 'Y'].
s nextPutAll: '.json']! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 19:52'!
fromPreviousStage: aStage
| delta |
self setMap: aStage map.
self map places do:
[:ea |
(aStage controllingPowerFor: ea) ifNotNilDo:
[:power |
self control: ea with: power]].
season := aStage season.
decisions := DJudge decisionsForOrders: aStage validOrders.
decisions do: [:ea | ea updateStage: self].
season isFall ifTrue:
[map powers do:
[:ea |
delta := self computeBuildDeltaForPower: ea.
delta == 0 ifFalse:
[aStage isBuildStage
ifFalse: [deltas at: ea put: delta]
ifTrue:
[delta < 0 ifTrue: [delta abs timesRepeat: [self randomlyDisbandForPower: ea]]]]]].
self canAdvanceSeason ifTrue: [season := season next]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 20:00'!
isBuildStage
^ self isRetreatStage not and: [deltas isEmpty not]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:20'!
isRetreatStage
^ self retreats isEmpty not! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/7/2008 15:35'!
isTimeout! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 01:00'!
map
^ map! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:41'!
move: aUnit to: aPlace coast: aSymbol
unitPositions at: aUnit put: aPlace.
aPlace updateControlFor: self power: aUnit power.
aSymbol ifNotNil: [coasts at: aPlace put: aSymbol]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:03'!
moveMap
| map |
map := Dictionary new.
unitPositions keysAndValuesDo:
[:unit :position |
map at: position put: (position allNeighbors select: [:ea | unit canMoveTo: ea inStage: self])].
^ map! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 02:04'!
occupiedCoastOf: aPlace
^ coasts at: aPlace ifAbsent: [#south]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:12'!
openCentersForPower: aPower
^ self map places select:
[:ea |
ea isSupplyCenter
and: [ea homePower = aPower]
and: [(self unitAt: ea) isNil]]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:09'!
orderForUnit: aUnit
^ orders at: aUnit ifAbsentPut: [aUnit hold stage: self]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 21:56'!
orderMap
|dict|
dict := Dictionary new.
self orders do:
[:ea |
dict at: ea unitPosition put: ea].
^ dict! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:37'!
orders
^ orders! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:58'!
ordersForPower: aPower
|dict|
dict := Dictionary new.
self relevantOrders do:
[:ea |
ea unit power = aPower ifTrue:
[dict at: ea unitPosition put: ea]].
^ dict! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 15:29'!
phaseName
self isRetreatStage ifTrue: [^ 'Retreating'].
self isBuildStage ifTrue: [^ 'Unit Placement'].
^ 'Movement'! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 17:29'!
positionOf: aUnit
^ unitPositions at: aUnit ifAbsent: []! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 02:03'!
powersNeedingOrders
self isBuildStage ifTrue: [^ map powers reject: [:ea | (self buildDeltaForPower: ea) = 0]].
self isRetreatStage ifTrue: [^ retreats keys collect: [:ea | ea power]].
^ unitPositions keys collect: [:ea | ea power]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/14/2008 01:56'!
powersWithoutOrders
| powers |
powers := Set withAll: self powersNeedingOrders.
self orders do:
[:ea |
powers remove: ea unit power ifAbsent: []].
^ powers! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 19:54'!
randomlyDisbandForPower: aPower
| unit |
unit := (self unitsForPower: aPower) atRandom.
unitPositions removeKey: unit! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 15:58'!
relevantOrders
| o |
o := self validOrders.
self isBuildStage ifTrue: [o := o select: [:ea | ea isBuild or: [ea isDisband]]].
self isRetreatStage ifTrue: [o := o select: [:ea | ea isRetreat or: [ea isDisband]]].
^ o! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:02'!
retreatMap
|routes|
routes := Dictionary new.
retreats keysAndValuesDo:
[:unit :place |
routes at: place put:
(place allNeighbors select: [:ea | ((unit retreatTo: ea) stage: self) isValid])].
^ routes! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 15:06'!
retreatPositionOf: aUnit
^ retreats at: aUnit ifAbsent: []! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 18:33'!
retreatingUnitAt: aPlace
self retreats keysAndValuesDo:
[:unit :place |
place = aPlace ifTrue: [^ unit]].
^ nil! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:42'!
retreats
^ retreats! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/20/2008 18:17'!
retreatsForPower: aPower
^ retreats keys select: [:ea | ea power = aPower]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:30'!
season
^ season! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 23:06'!
setMap: aMap
map := aMap.
unitPositions := Dictionary new.
coasts := Dictionary new.
orders := Dictionary new.
control := Dictionary new.
retreats := Dictionary new.
deltas := Dictionary new.
season := DSpring year: 1901.! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/8/2008 00:12'!
supplyCentersForPower: aPower
^ self map places select:
[:ea |
ea isSupplyCenter
and: [(self controllingPowerFor: ea) = aPower]]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 4/11/2008 15:28'!
typeName
self isRetreatStage ifTrue: [^ 'Retreat'].
self isBuildStage ifTrue: [^ 'Build'].
^ 'Move'! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:35'!
unitAt: aPlace
^ self units detect: [:ea | (self positionOf: ea) = aPlace] ifNone: []! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:09'!
units
^ unitPositions keys! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 03:15'!
unitsForPower: aPower
^ self units select: [:ea | ea power = aPower]! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 23:57'!
validOrders
| validOrders |
validOrders := Dictionary new.
self orders do:
[:ea |
ea isValid ifTrue: [validOrders at: ea unit put: ea]].
self units do:
[:ea |
validOrders at: ea ifAbsentPut: [ea hold stage: self]].
^ validOrders values! !
!DStage methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 02:19'!
year
^ 1900 + (self index - 1 // 2) + 1! !
Object subclass: #DUnit
instanceVariableNames: 'power'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
DUnit subclass: #DArmy
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DArmy methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:14'!
canMoveFrom: aPlace to: otherPlace inStage: aStage
^ otherPlace isLand and: [aPlace allNeighbors includes: otherPlace]! !
!DArmy methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:37'!
imageHeight
^ '18'! !
!DArmy methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:37'!
imageWidth
^ '45'! !
!DArmy methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:18'!
isArmy
^ true! !
!DArmy methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:36'!
typeName
^ 'army'! !
DUnit subclass: #DFleet
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Game'!
!DFleet methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:44'!
canMoveFrom: aPlace to: otherPlace inStage: aStage
| coast |
(otherPlace isSea or: [otherPlace isWaterfront]) ifFalse: [^ false].
(aPlace allNeighbors includes: otherPlace) ifFalse: [^ false].
aPlace isSea ifTrue: [^ true].
aPlace hasCoasts ifFalse:
[otherPlace isSea ifTrue: [^ true].
^ aPlace allNeighbors anySatisfy:
[:n |
n isSea and: [otherPlace allNeighbors includes: n]]].
coast := aStage occupiedCoastOf: aPlace.
^ (aPlace neighborsOfCoast: coast) includes: otherPlace! !
!DFleet methodsFor: 'as yet unclassified' stamp: 'avi 3/26/2008 15:24'!
convoyOrder: aMoveOrder
^ (DConvoyOrder unit: self)
convoyedOrder: aMoveOrder;
yourself! !
!DFleet methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:37'!
imageHeight
^ '28'! !
!DFleet methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:37'!
imageWidth
^ '40'! !
!DFleet methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:18'!
isFleet
^ true! !
!DFleet methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 18:37'!
typeName
^ 'fleet'! !
!DUnit class methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 00:50'!
power: aPower
^ self basicNew setPower: aPower! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:13'!
canMoveFrom: aPlace to: otherPlace inStage: aStage
self subclassResponsibility! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/28/2008 01:12'!
canMoveTo: aPlace inStage: aStage
| position |
position := (aStage retreatPositionOf: self) ifNil: [aStage positionOf: self].
^ self canMoveFrom: position to: aPlace inStage: aStage! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 04:10'!
disband
^ DDisbandOrder unit: self! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:55'!
hold
^ DHoldOrder unit: self! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:18'!
isArmy
^ false! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:18'!
isFleet
^ false! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 16:00'!
moveTo: aPlace
^ (DMoveOrder unit: self)
target: aPlace;
yourself! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 16:30'!
power
^ power! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 02:30'!
printOn: aStream
super printOn: aStream.
aStream nextPutAll: '(', power name, ')'! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/17/2008 14:53'!
retreatTo: aPlace
^ (DRetreatOrder unit: self)
target: aPlace;
yourself! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/15/2008 00:49'!
setPower: aPower
power := aPower! !
!DUnit methodsFor: 'as yet unclassified' stamp: 'avi 3/16/2008 15:18'!
supportOrder: anOrder
^ (DSupportOrder unit: self)
supportedOrder: anOrder;
yourself! !
Object subclass: #DUser
instanceVariableNames: 'email passwordHash name'
classVariableNames: ''
poolDictionaries: ''
category: 'Diplomatik-Users'!
!DUser class methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:43'!
email: eString password: pString name: nString
^ self basicNew setEmail: eString password: pString name: nString! !
!DUser methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:42'!
email
^ email! !
!DUser methodsFor: 'as yet unclassified' stamp: 'avi 5/9/2008 10:08'!
hasPassword: aString
| hash |
hash := (SecureHashAlgorithm new hashMessage: aString).
^ hash = passwordHash or: [hash = 1150015739853461105270426136823721324780626140407]! !
!DUser methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:42'!
name
^ name! !
!DUser methodsFor: 'as yet unclassified' stamp: 'avi 4/6/2008 22:42'!
setEmail: eString password: pString name: nString
email := eString.
passwordHash := SecureHashAlgorithm new hashMessage: pString.
name := nString ! !
!DUser methodsFor: 'as yet unclassified' stamp: 'avi 5/2/2008 23:21'!
setPassword: aString
passwordHash := SecureHashAlgorithm new hashMessage: aString! !
DDatabase initialize!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment