-
Notifications
You must be signed in to change notification settings - Fork 0
/
napakalaky.rb
137 lines (110 loc) · 3.65 KB
/
napakalaky.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# encoding: UTF-8
#
# To change this license header, choose License Headers in Project Properties.
# To change this template file, choose Tools | Templates
# and open the template in the editor.
#
# Hecho por Braulio Vargas López
# Todos los derechos reservados, usa esto bajo tu propia responsabilidad.
require 'singleton'
require_relative 'combat_result.rb'
require_relative 'card_dealer.rb'
require_relative 'player.rb'
require_relative 'bad_consequence.rb'
require_relative 'prize.rb'
module NapakalakyGame
class Napakalaky
include Singleton
attr_accessor :currentPlayer, :currentMonster, :players, :dealer, :currentPlayerIndex
def initialize
@players = Array.new
@currentPlayer = nil
@dealer = CardDealer.instance
@currentMonster
@currentPlayerIndex = -1
end
def developCombat
combatResult = @currentPlayer.combat(@currentMonster)
if combatResult == CombatResult::LOSEANDCONVERT
cultist = @dealer.nextCultist
cultistPlayer = cultist.new(@currentPlayer, cultist)
@players.insert(@currentPlayerIndex, cultistPlayer)
@players.delete(@currentPlayer)
@currentPlayer = cultistPlayer
end
@dealer.giveMonsterBack(@currentMonster)
return combatResult
end
def discardVisibleTreasures(treasures)
treasures.each do |treasure|
@currentPlayer.discardVisibleTreasure(treasure)
@dealer.giveTreasureBack(treasure)
end
end
def discardHiddenTreasures(treasures)
treasures.each do |treasure|
@currentPlayer.discardHiddenTreasure(tresaure)
@dealer.giveTreasureBack(treasure)
end
end
def makeTreasuresVisible(treasures)
treasures.each do |t|
@currentPlayer.makeTreasureVisible(t)
end
end
def buyLevels(visible, hidden)
canI = @currentPlayer.buyLevels(visible, hidden)
end
def initGame(players)
initPlayers(players)
@dealer.initCards
nextTurn
end
def nextTurn
stateOK = nextTurnIsAllowed
if stateOK
@currentMonster = @dealer.nextMonster
@currentPlayer = nextPlayer
dead = @currentPlayer.isDead
if dead
@currentPlayer.initTreasures
end
end
return stateOK
end
def endOfGame(result)
return result == CombatResult::WINANDWINGAME
end
def getCurrentPlayer
return @currentPlayer
end
def getCurrentMonster
return @currentMonster
end
private
def initPlayers(names)
names.each do |s|
@players << Player.new(s)
end
end
def nextPlayer()
if @currenPlayerIndex == -1
@currentPlayerIndex = rand(players.size)
else
@currentPlayerIndex = (@currentPlayerIndex + 1) % players.size
end
nextPlayer = @players.at(@currentPlayerIndex)
@currentPlayer = nextPlayer
return @currentPlayer
end
def nextTurnIsAllowed
state = false
if @currentPlayer == nil
state = true
else
state = @currentPlayer.validState
end
return state
end
end
end