Gamecore (#3)
* create some class * create some base classes * fixup Co-authored-by: Ho-spair <linyuy@163.com>
This commit is contained in:
parent
dea1c40ad8
commit
3dc95ebc49
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -1,52 +1,37 @@
|
||||||
-- class Card : public Object
|
local SUITS = {
|
||||||
local Card = class('Card')
|
"Spade",
|
||||||
|
"Club",
|
||||||
-- public:
|
"Diamond",
|
||||||
|
"Heart",
|
||||||
-- enum Suit
|
"NonSuit",
|
||||||
Card.Suit = {
|
|
||||||
Spade = 0,
|
|
||||||
Club = 1,
|
|
||||||
Heart = 2,
|
|
||||||
Diamond = 3,
|
|
||||||
NoSuitBlack = 4,
|
|
||||||
NoSuitRed = 5,
|
|
||||||
NoSuit = 6,
|
|
||||||
SuitToBeDecided = -1,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-- enum Color
|
CardSuit = Util:createEnum(SUITS)
|
||||||
Card.Color = {
|
|
||||||
Red = 0,
|
local COLOR = {
|
||||||
Black = 1,
|
"Red",
|
||||||
Colorless = 2,
|
"Black",
|
||||||
|
"NonColor",
|
||||||
}
|
}
|
||||||
|
|
||||||
-- enum HandlingMethod
|
CardColor = Util:createEnum(COLOR)
|
||||||
Card.HandlingMethod = {
|
|
||||||
MethodNone = 0,
|
|
||||||
MethodUse = 1,
|
|
||||||
MethodResponse = 2,
|
|
||||||
MethodDiscard = 3,
|
|
||||||
MethodRecast = 4,
|
|
||||||
MethodPindian = 5,
|
|
||||||
}
|
|
||||||
function Card:initialize(suit, number)
|
|
||||||
|
|
||||||
|
local Card = class("Card")
|
||||||
|
|
||||||
|
function Card:initialize(name, suit, cardNumber)
|
||||||
|
self.name = name
|
||||||
|
self.suit = suit
|
||||||
|
self.cardNumber = cardNumber
|
||||||
end
|
end
|
||||||
|
|
||||||
-- private:
|
function Card:getColor()
|
||||||
local subcards = {} -- array of cards
|
if self.suit == CardSuit.Spade or self.suit == CardSuit.Club then
|
||||||
local target_fixed
|
return CardColor.Red
|
||||||
local mute
|
elseif self.suit == CardSuit.Diamond or self.suit == CardSuit.Heart then
|
||||||
local will_throw
|
return CardColor.Black
|
||||||
local has_preact
|
else
|
||||||
local can_recast
|
return CardColor.NonColor
|
||||||
local m_suit
|
end
|
||||||
local m_number
|
end
|
||||||
local id
|
|
||||||
local skill_name
|
|
||||||
local handling_method
|
|
||||||
local flags = {}
|
|
||||||
|
|
||||||
return Card
|
return Card
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
local Sanguosha = class("Engine")
|
||||||
|
|
||||||
|
function Sanguosha:initialize()
|
||||||
|
self.skills = {}
|
||||||
|
self.generals = {}
|
||||||
|
self.cards = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function Sanguosha:addSkill(skill)
|
||||||
|
table.insert(self.skills, skill)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Sanguosha:addGeneral(general)
|
||||||
|
table.insert(self.generals, general)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Sanguosha:addCard(card)
|
||||||
|
table.insert(self.cards, cards)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Sanguosha:getGeneralsRandomly(num, generalPool, except, filter)
|
||||||
|
if filter then
|
||||||
|
assert(type(filter) == "function")
|
||||||
|
end
|
||||||
|
|
||||||
|
generalPool = generalPool or self.generals
|
||||||
|
except = except or {}
|
||||||
|
|
||||||
|
local availableGenerals = {}
|
||||||
|
for _, general in ipairs(generalPool) do
|
||||||
|
if not table.contains(except, general) and not (filter and filter(general)) then
|
||||||
|
table.insert(availableGenerals, general)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #availableGenerals == 0 then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
local result = {}
|
||||||
|
while num > 0 do
|
||||||
|
local randomGeneral = math.random(1, #availableGenerals)
|
||||||
|
table.insert(result, randomGeneral)
|
||||||
|
table.remove(availableGenerals, randomGeneral)
|
||||||
|
|
||||||
|
if #availableGenerals == 0 then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
function Sanguosha:getAllGenerals(except)
|
||||||
|
local result = {}
|
||||||
|
for _, general in ipairs(self.generals) do
|
||||||
|
if not (except and table.contains(except, general)) then
|
||||||
|
table.insert(result, general)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return result
|
||||||
|
end
|
||||||
|
|
||||||
|
return Sanguosha
|
|
@ -0,0 +1,19 @@
|
||||||
|
General = class("General")
|
||||||
|
|
||||||
|
function General:initialize(package, name, kingdom, hp, maxHp, gender, initialHp)
|
||||||
|
self.package = package
|
||||||
|
self.name = name
|
||||||
|
self.kingdom = kingdom
|
||||||
|
self.hp = hp
|
||||||
|
self.maxHp = maxHp
|
||||||
|
self.gender = gender
|
||||||
|
self.initialHp = initialHp or maxHp
|
||||||
|
|
||||||
|
self.skills = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function General:addSkill(skill)
|
||||||
|
table.insert(self.skills, skill)
|
||||||
|
end
|
||||||
|
|
||||||
|
return General
|
|
@ -0,0 +1,27 @@
|
||||||
|
local Player = class("Skill")
|
||||||
|
|
||||||
|
function Player:initialize()
|
||||||
|
self.hp = nil
|
||||||
|
self.maxHp = nil
|
||||||
|
self.general = nil
|
||||||
|
self.dying = false
|
||||||
|
self.dead = false
|
||||||
|
self.playerSkills = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function Player:setGeneral(general, setHp, addSkills)
|
||||||
|
self.general = general
|
||||||
|
if setHp then
|
||||||
|
self.maxHp = general.maxHp
|
||||||
|
self.hp = general.initialHp
|
||||||
|
end
|
||||||
|
|
||||||
|
if addSkills then
|
||||||
|
table.insertTable(self.playerSkills, general.skills)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Player:setHp(maxHp, initialHp)
|
||||||
|
self.maxHp = maxHp
|
||||||
|
self.hp = initialHp or maxHp
|
||||||
|
end
|
|
@ -0,0 +1,32 @@
|
||||||
|
local SKILL_TYPE = {
|
||||||
|
"Common",
|
||||||
|
"Frequent",
|
||||||
|
"Compulsory",
|
||||||
|
"Awaken",
|
||||||
|
"Limit",
|
||||||
|
"Lord",
|
||||||
|
}
|
||||||
|
|
||||||
|
SkillType = Util:createEnum(SKILL_TYPE)
|
||||||
|
|
||||||
|
local Skill = class("Skill")
|
||||||
|
|
||||||
|
function Skill:initialize(name, skillType)
|
||||||
|
self.name = name
|
||||||
|
self.description = ":" .. name
|
||||||
|
self.skillType = skillType
|
||||||
|
end
|
||||||
|
|
||||||
|
local TriggerSkill = class("TriggerSkill", Skill)
|
||||||
|
|
||||||
|
function TriggerSkill:initialize(spec)
|
||||||
|
Skill.initialize(self, spec.name, spec.skillType)
|
||||||
|
self.isRefreshAt = spec.isRefreshAt
|
||||||
|
self.isTriggerable = spec.isTriggerable
|
||||||
|
self.targetFilter = spec.targetFilter
|
||||||
|
self.cardFilter = spec.cardFilter
|
||||||
|
self.beforeTrigger = spec.beforeTrigger
|
||||||
|
self.onTrigger = spec.onTrigger
|
||||||
|
end
|
||||||
|
|
||||||
|
return Skill
|
|
@ -1,11 +1,13 @@
|
||||||
-- Fundemental script for FreeKill
|
-- Fundemental script for FreeKill
|
||||||
-- Load mods, init the engine, etc.
|
-- Load mods, init the engine, etc.
|
||||||
|
|
||||||
package.path = package.path .. ';./lua/lib/?.lua'
|
package.path = package.path .. ";./lua/lib/?.lua"
|
||||||
|
.. ";./lua/core/?.lua"
|
||||||
|
|
||||||
-- load libraries
|
-- load libraries
|
||||||
class = require 'middleclass'
|
class = require "middleclass"
|
||||||
json = require 'json'
|
json = require "json"
|
||||||
|
Util = require "util"
|
||||||
|
|
||||||
DebugMode = true
|
DebugMode = true
|
||||||
|
|
||||||
|
@ -16,3 +18,9 @@ function pt(t)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- load core classes
|
-- load core classes
|
||||||
|
Sanguosha = require "engine"
|
||||||
|
General = require "general"
|
||||||
|
Card = require "card"
|
||||||
|
Skill = require "skill"
|
||||||
|
|
||||||
|
-- load packages
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
local EVENTS = {
|
||||||
|
"GameStart",
|
||||||
|
|
||||||
|
"PhaseChanging",
|
||||||
|
"PhaseStart",
|
||||||
|
"PhaseProceeding",
|
||||||
|
"PhaseEnd",
|
||||||
|
|
||||||
|
"PreCardUse",
|
||||||
|
"AfterCardUseDeclared",
|
||||||
|
"AfterCardTargetDeclared",
|
||||||
|
"CardUsing",
|
||||||
|
"CardUseFinished",
|
||||||
|
}
|
||||||
|
|
||||||
|
GameEvent = Util:createEnum(EVENTS)
|
|
@ -0,0 +1,23 @@
|
||||||
|
function logic()
|
||||||
|
chooseGeneral()
|
||||||
|
initSkillList()
|
||||||
|
actionNormal()
|
||||||
|
end
|
||||||
|
|
||||||
|
function chooseGeneral()
|
||||||
|
for _, p in ipairs(room:getPlayers()) do
|
||||||
|
local g = p:askForGeneral()
|
||||||
|
room:changeHero(p, g)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function actionNormal()
|
||||||
|
local p = room:getLord()
|
||||||
|
while true do
|
||||||
|
room:setCurrent(p)
|
||||||
|
act(room:getCurrent)
|
||||||
|
p = p:getNextAlive()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function trigger() end
|
|
@ -0,0 +1,18 @@
|
||||||
|
Room = class("Room")
|
||||||
|
|
||||||
|
-- Just same as "static int roomId" in cpp
|
||||||
|
-- However id 0 is for lobby, so we start at 1
|
||||||
|
local roomId = 1
|
||||||
|
|
||||||
|
function Room:initialize()
|
||||||
|
self.id = roomId
|
||||||
|
roomId = roomId + 1
|
||||||
|
self.room = ServerInstace:findRoom(self.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Room:getCProperties()
|
||||||
|
self.name = self.room:getName()
|
||||||
|
self.capacity = self.room:getCapacity()
|
||||||
|
end
|
||||||
|
|
||||||
|
return Room
|
|
@ -1,4 +1,4 @@
|
||||||
local Server = class('Server')
|
local Server = class("Server")
|
||||||
|
|
||||||
freekill.server_callback = {}
|
freekill.server_callback = {}
|
||||||
|
|
||||||
|
@ -12,6 +12,13 @@ function Server:initialize()
|
||||||
print("Server error: Unknown command " .. command);
|
print("Server error: Unknown command " .. command);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
self.rooms = {} -- hashtable: uid --> room
|
||||||
|
self.players = {} -- hashtable: uid --> splayer
|
||||||
|
end
|
||||||
|
|
||||||
|
function Server:createRoom(owner, roomName, capacity)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
freekill.server_callback["CreateRoom"] = function(jsonData)
|
freekill.server_callback["CreateRoom"] = function(jsonData)
|
||||||
|
@ -21,6 +28,7 @@ freekill.server_callback["CreateRoom"] = function(jsonData)
|
||||||
local roomName = data[2]
|
local roomName = data[2]
|
||||||
local capacity = data[3]
|
local capacity = data[3]
|
||||||
freekill.ServerInstance:createRoom(owner, roomName, capacity)
|
freekill.ServerInstance:createRoom(owner, roomName, capacity)
|
||||||
|
ServerInstance:createRoom()
|
||||||
end
|
end
|
||||||
|
|
||||||
freekill.server_callback["EnterRoom"] = function(jsonData)
|
freekill.server_callback["EnterRoom"] = function(jsonData)
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
function table:contains(element)
|
||||||
|
if #self == 0 or type(self[1]) ~= type(element) then return false end
|
||||||
|
for _, e in ipairs(self) do
|
||||||
|
if e == element then return true end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function table:insertTable(list)
|
||||||
|
for _, e in ipairs(list) do
|
||||||
|
table.insert(self, e)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local Util = class("Util")
|
||||||
|
|
||||||
|
function Util.static:createEnum(tbl, index)
|
||||||
|
assert(type(tbl) == "table")
|
||||||
|
local enumtbl = {}
|
||||||
|
local enumindex = index or 0
|
||||||
|
for i, v in ipairs(tbl) do
|
||||||
|
enumtbl[v] = enumindex + i
|
||||||
|
end
|
||||||
|
return enumtbl
|
||||||
|
end
|
||||||
|
|
||||||
|
return Util
|
Loading…
Reference in New Issue