遊戲策劃配表並自動更新到資料庫
阿新 • • 發佈:2018-12-31
在遊戲開發中,數值是必不可少的,數值一般由策劃設計匯出,然後開發再將數值應用於遊戲程式碼中。但是策劃的需求是經常會變的,這就導致數值會頻道的修正,如果沒次都去更新程式碼來匯入這會給開發帶來很多不必要的麻煩,所以設計一套配表系統和自動讀取匯入的小工具就顯得很有必要。
下面這套小工具是基於公司的一套lua手遊服務端開發的配表工具。配表採用csv檔案來實現,csv可以用excel開啟,方便策劃們直觀的配置遊戲資料。同時csv檔案是逗號分隔檔案,程式方面也很容易進行解析。先貼上一段lua解析csv檔案的程式碼(暫時沒有實現讀取子資料夾內檔案的功能,可以自行新增)
for file in lfs.dir(csv_file_path) do
if file ~= "." and file ~= ".." then
local real_file = csv_file_path .."/".. file
--獲取標題和內容
local parsed_csv_titles,parsed_csv_table = parse_csv:load_csv_file(real_file)
end
end
local M = {}
local log = require("log"):new("parse_csv")
function split(str, reps)
local resultStrsList = {};
string.gsub(str, '[^' .. reps ..']+', function(w) table.insert(resultStrsList, w) end );
return resultStrsList;
end
--一行一行取用資料
local function get_row_content(file)
local content;
local check = false
local count = 0
while true do
local t = file:read()
if not t then
if count == 0 then
check = true
end
break
end
if not content then
content = t
else
content = content..t
end
local i = 1
while true do
local index = string.find(t, "\"", i)
if not index then break end
i = index + 1
count = count + 1
end
if count % 2 == 0 then
check = true
break
end
end
if not check then
assert(1~=1)
end
--返回去掉空格的一行資料,還有方法沒看明白,以後再修改
return content and (string.gsub(content, " ", ""))
end
function M:load_csv_file(filePath)
-- 讀取檔案
local alls = {}
local file = io.open(filePath, "r")
while true do
local line = get_row_content(file)
if not line then
break
end
table.insert(alls, line)
end
--[[ 從第3行開始儲存(第一行是中文註釋,第二行是標題,後面的行才是內容) 用二維陣列儲存:arr[ID][屬性標題字串] ]]
local titles = split(alls[2], ",")
local ID = 1
local arrs = {}
for i = 3, #alls, 1 do
-- 一行中,每一列的內容,第一位為ID
local content = split(alls[i], ",")
ID = tonumber(content[1])
--儲存ID,以便遍歷取用,原來遍歷可以使用in pairs來執行,所以這個不需要了
--table.insert(arrs, i-1, ID)
arrs[ID] = {}
-- 以標題作為索引,儲存每一列的內容,取值的時候這樣取:arrs[1].Title
for j = 1, #titles, 1 do
arrs[ID][titles[j]] = content[j]
end
end
--[[
for l = 1, #titles, 1 do
log:info("title = " ..titles[l])
end
for k = 1, #arrs,1 do
log:info("key = " ..arrs[k].card_id .. " value = " ..arrs[k].card_type)
end
--]]
--返回標題和內容
return titles,arrs
end
return M
對於解析出來的資料,我們還需要匯入到資料庫,這裡我採用的是mongodb資料庫,每次更新完配表,策劃只需要點選客戶端工具上面的“更新資料庫”按鈕即可完成服務端的自動更新。客戶端工具僅僅是傳送一個rpc請求給伺服器,讓伺服器完成配表的讀取與匯入,客戶端實現很簡單就不貼程式碼了。服務端更新資料庫程式碼如下:
for l = 1, #parsed_csv_titles, 1 do
log:info("title = " ..parsed_csv_titles[l])
end
for i = 1, #parsed_csv_table,1 do
--迴圈構造出插入的子語句
local state = {}
for j = 1, #parsed_csv_titles, 1 do
local key = parsed_csv_titles[j]
local value = parsed_csv_table[i][key]
state[key] = value
-- log:info(parsed_csv_titles[j] .. "=" ..parsed_csv_table[i][parsed_csv_titles[j]] .. " ")
end
--先查詢該條目是否存在,如果存在則更新,否則插入
card_index = parsed_csv_table[i].card_index
mdb:update(db, collection, {card_index = card_index},state)
end
實現效果: