作者KIMsquall (KIM)
看板BBSLua
標題[Lua ] 簡易RPG試做 (未完成)
時間Fri Oct 17 02:32:23 2008
這是一份 BBSLua 程式,可在 PTT2 上
按 L 開始執行
(若出現錯誤或無反應,請先試著重登)
若您中途想中斷程式執行,按下 Ctrl-C 即可
相關資訊請見 PTT2 BBSLua 板
這是最近發現BBS lua後,練習試做的RPG
很久以前就想寫支援telnet的RPG,跟mud不一樣的是,我希望是以圖型為主文字為輔
好加在lua這種程式語言並不難,寫起來跟qbasic大同小異
修改了幾個範例就很容易上手
以前也有試過用Qbasic寫過幾個不成熟的RPG
這次想說一邊練習lua,順便一邊試著完成從以前開始就想做的事
目前大概只完成30%左右的系統架構
其中裡面某些程式碼是參考板上某些前輩的
希望能引起各位大大的指教及更多人對lua的興趣
2008/11/18 更新
增加了旅館功能
2008/10/31 更新
終於回家了 ~_~
因為遊戲系統跟劇情內容還在構思
所以一直沒有很大的更新
在戰鬥中可以按下i,呼叫假面超人
--#BBSLUA
-- Interface: 0.119
-- Title: mimicat RPG (未完成)
-- Notes: TEST
-- Version: 0.1 Beta
-- Author: KIM
-- Date: 2008/11/19
-- 戰士系 劍客/劍豪/劍聖(sword)
-- 武者/武術家/武聖(axe,hammer)
-- 騎士/聖騎士/光之聖騎(spear)
-- 法師系 僧侶/牧師/教皇
-- 魔法士/魔導師/大魔導師
-- 鍊金者/鍊金術士/白金鍊金術士
-- 遊俠系
-- 盜賊/刺客/隱殺者(dagger)
-- 探險者/冒險家/考古學家
-- 弓箭手/獵人/神箭手
-- 法師(staff)/冒險家(dagger)/弓箭手(bow)/劍客(sword)/騎士(spear)/狂戰士(axe)
-- 裝備魔法屬性
-- ar atk_range
-- 技能 戰鬥系 dagger(無限斬擊,天舞無雙) sword(連續劍,居合斬)
-- hammer 大地吼,擊破
-- axe 使用起來笨重的武器,威力奇高但命中率低,必需很接近才能使用 旋風斧
-- spear 攻擊力普通,攻擊距離大,可無視敵人防禦 橫掃千軍,猛龍出海
map01={
{59,59,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
{59,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,61,63,61,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,61,00,61,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{59,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{59,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{59,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{59,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,61,63,61,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,61,42,61,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,51,52,51,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,51,00,51,00,00,00,02,02,02,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,02,02,02,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,61,00,00,00,00,00,00,00,00},
{00,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,00,00,00,00,00,00,00,00},
{00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
{00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
{00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
{00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
{00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00},
}
storeimgs = {
imgs = {
[1] = {' 價目表 | 人客你要什麼 ',
' 休息 300 | \\ ',
' 住宿 1200 | ',
' 小姐 2500 | _(OwO )__ ',
' └∕ \\ ︶ \\ \\───',
' \\ ノ ︵╮ /____ ',
' Λ Λ ╲  ̄≡) _/ | | ',
' ( ) ▕ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄',
' | u ▕ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄',
' ∪ ∪ ▕ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄',
'▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔',
'按下alt+f4鍵離開 ',
}
},
name = {
[1] = "貴到爆道具店",
},
}
game_imgs = {
[1] = {'*[1;36;40m╭═╮╭═╮╔╦╮╔═╮ ╭═╮╭ ╮╔═╮╔═╮*[m',
'*[1;37;40m║╭╗╠═╣║║║╠═ ║ ║║ ║╠═ ╠═╝*[m',
'*[1;34;40m╰═╝╙ ╜╯╜╜╚═╯ ╰═╯╚═╝╚═╯╙ ╰ *[m',
'*[1;31;40m 你已經屎了*[m',
'*[1;30;40m Gamedesign by KIM*[m',
},
[2] = { '*[1m ______════_▕▔▔▔▔▏______< ≡≡≡≡<______*[m',
'*[m *[0;30;47m◤*[1;33mo*[37m╭──╮▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔╭──╮*[36mo*[0;30;47m◥*[m',
'*[m *[30;47m◤ *[1m█│*[30m██*[37m│________________║________________│*[30m██*[37m│*[30m█ *[0;30;47m◥*[m',
'*[1;34m ▕*[37;44m ㊣ │*[30m██*[37m│*[0;34;40m████████*[1;44m║*[0;34;40m████████*[1;37;44m│ │ ㊣ *[34;40m▏*[m',
'*[1;34m ▕*[37;44m E404│*[30m██*[37m│ *[34m ║ *[37m │ │E404 *[34;40m▏*[m',
'*[1;34m ▕*[44m■══▃▃▃══════════════════▃▃▃══■*[40m▍*[m',
'*[1;34m◢◤*[36m▔*[37m◎=◎=◎
▔▔ \==========// ≡≡≡≡▔▔▔▔*[37m◎=◎=◎*[36m▔\*[1;34m◣*[m',
},
[3] = { ' ',
'
',
'
',
'
',
'
',
'
System is busy ',
'
',
'
The system is busy waiting for the close program dialog box to be ',
'
displayed. You can wait and see if it appears, or you can restart ',
'
your computer. ',
'
',
'
* Press any key to return to Windows and wait. ',
'
* Press CTRL+ALT+DEL again to restart your computer. You will ',
'
lose all information in all programs that are running. ',
'
',
'
',
'
Press any key to continue ',
'
',
'
',
'
',
'
',
'
',
'
',
},
}
mimicat = {
x = 10,
y = 17,
plocx = 0,
plocy = 10,
lv = 1,
exp = 0,
con = 4,
dex = 4,
str = 4,
int = 4,
luk = 4,
cha = 1,
def = 2,
use_def = 0,
ap = 0,
hp = 0,
mp = 0,
hpmax = 0,
mpmax = 0,
move_range = 4,
act_range = 4,
-- index of image
img_i = 0,
-- mimicat's images
imgs = {
[0] = {
' Λ Λ ',
'(′Δ‵)',
'<︳ ︱>',
' ∪ ∪',
},
[1] = {
' Λ Λ ',
'(′Δ‵)',
'U︳ ︱\\',
' U ∪ ',
},
[2] = {
' Λ Λ ',
'(′Δ‵)',
'/︳ ︱U',
' ∪ U ',
},
[3] = {
' Λ Λ ',
'(′▽‵)',
'<︳宅 ︱Y',
' ∪ ∪ ',
},
[4] = {
' Λ Λ ',
' (‵△′) ',
' <︳ ︱O ',
' ∪ ∪ ',
},
[5] = {
' Λ Λ ',
' (‵△′) ',
' <︳ ︱O ',
' U ∪ ',
},
[6] = {
' Λ Λ ',
' (‵△′) ',
' <︳ ︱O ',
' ∪ U ',
},
[7] = {
' Λ Λ ',
' (ㄧ▁ㄧ) ',
' O︳烙▕o ',
' ∪ U ',
},
[8] = {
' Λ Λ ',
' (ㄧ▁ㄧ) ',
' o︳跑▕O ',
' U ∪ ',
},
},
wp_type = "staff",
wp_atk = 40,
wp_range = 0,
wp_sk = "summon train",
wp_sk_lv = 5,
eq = {
helm = {
name = '',
def = 0,
},
},
}
-- mr 魔法抵消 dmg 額外攻擊力
-- ah 吸血 am 吸魔
magic = {
def = 0,
str = 5,
dex = 0,
con = 0,
int = 2,
cha = 0,
mov_range = 0,
atk_range = 0,
mr = 0,
ah = 10,
am = 10,
addexp = 0,
dmg = 0,
}
item = {
eq = {
helm = {
},
armor,
glove,
weapon,
shield,
boot,
ring = {},
},
potion = {
[1] = {
name = "經驗測試藥水",
price = 50,
},
},
book = {
[1] = {
name = "無限斬擊之書",
price = 100,
sk = "final hit",
},
},
}
npc = {
count = 6,
npc = {
[1] = {
name = "提拉米蘇",
img = {
[1] = {
' Ω Ω',
'(‧π‧) ',
'/︳提︱\\',
' ∪ ∪',
},
},
locx = 9,
locy = 15,
mob = 0,
visable = 1,
talkcount = 2,
talk = {
[1] = {'您好,我叫提拉米蘇',
'我是作者製造的第一隻npc',
'旁邊那沱像大便的是史萊姆',
},
[2] = {'目前這個程式只完成20%',
'所以有很多東西不能執行',
},
},
},
[2] = {
name = "武器木板",
img = {
[1] = {
'*[33m┌──┐*[m',
'*[33m│≡≡│*[m',
'*[33m└┬┬┘*[m',
'*[33m ∥∥ *[m',
},
},
locx = 8,
locy = 15,
visable = 1,
mob = 0,
talkcount = 5,
talk = {
[1] = {'這個遊戲的武器系統共分為劍,鎚,斧,矛,匕首,弓,杖',
'以下大概做個說明',
},
[2] = {'劍的命中率高,攻擊力平穩,範圍中等,',
'算是最適合初期所使用的武器,',
'鎚的命中率較低,攻擊力強,攻擊距離小,',
'但是有機會將敵人敲暈使敵人無法行動',
},
[3] = {'斧的命中率低,攻擊力最強,攻擊距離小,',
'可以無視對手防禦力給予重擊',
'矛的命中率中等,攻擊力平穩,攻擊距離遠,',
'算是最適合初期所使用的武器',
},
[4] = {'匕首命中率高,攻擊力小,暴擊率高,',
'適合遊俠型玩家使用,可以搭配特殊技給予敵人重創',
'弓箭命中率中,攻擊力中,攻擊距離最遠,可以在遠處就讓敵人重創',
'杖為法術專用,發射光箭,威力強距離遠,使用光箭需耗費魔力',
},
[5] = {'其中還有一些隱藏性質的kuso武器,等待開發完成,',
'不同的武器需要搭配不同的特殊技,之後請等待遊戲開發後',
'完成請玩家自行發覺',
},
},
},
[3] = {
name = "史萊姆王",
img = {
[1] = {
' *[30;44m◤*[m◣',
'*[0;30;44m◤ *[37m◥*[m◣',
'*[1;33;44m ⊙⊙ *[m',
'*[0;30;44m◣*[31m ︶ *[m◤',
},
},
locx = 7,
locy = 15,
visable = 1,
mob = 3,
talkcount = 1,
talk = {
[1] = {'(\\__/#)',
'沒看過囂張的大便嗎'
},
},
},
[4] = {
name = "北七熊",
img = {
[1] = {
'*[31m n___n*[m',
'*[31m(-*[37m(*)*[31m-)*[m',
'*[31m/_ _\\*[m',
'*[31m(m m)*[m'
},
},
locx = 9,
locy = 18,
visable = 1,
type = 'npc',
mob = 0,
talkcount = 3,
talk = {
[1] = {'這遊戲一隻角色只能學習一種特技',
'不同的特技要配合不同的武器',
'例如無限斬擊一定要搭配匕首(dagger)',
'連續劍就要使用劍類武器(sword)才能使用',
},
[2] = {'必殺技的學習是經由書本(book)來學習',
'書本的取得方式為購買或是寶箱開啟取得',
'必殺技會消耗mp或是hp或是金幣',
},
[3] = {'我向前跑進人群,大叫要他們停手,67754但…我在泥巴',
'裡摔倒。我抬頭看到一位老奶奶慈祥的臉。我抓住她的手…',
'但她竟然一腳踢到我的牙齒...',
},
},
},
[5] = {
name = "史萊姆",
img = {
[1] = {
' *[30;43m◤*[m◣',
'*[0;30;43m◤ *[37m◥*[m◣',
'*[1;33;43m ⊙⊙ *[m',
'*[0;30;43m◣*[31m ︶ *[m◤',
},
},
locx = 6,
locy = 15,
visable = 1,
type = 'mob',
mob = 1,
talkcount = 1,
talk = {
[1] = {'不要踩到我,不要踩到我,不要踩到我..',
},
},
},
[6] = {
name = "火星人",
img = {
[1] = {
' |||||| ',
' (⊙⊙) ',
' ( ) ',
'╭||||╮',
},
},
locx = 9,
locy = 20,
visable = 1,
type = 'mob',
mob = 4,
talkcount = 1,
talk = {
[1] = {'想跟火星人溝通,你頭殼有洞喔?....',
},
},
},
}, -- end npc
}
mob = {
[1] = {
name = "史萊姆",
mov_range = 4,
atk_range = 4,
atk = 10,
hp = 40,
exp = 10,
def = 2,
imgs = {
[1] = {' ',' ',' ',' ',' ',
' __/ \\__ ',
' / ⊙ ⊙ \\ ',
' \\_______/ ',
},
},
},
[2] = {
name = "千本針",
mov_range = 4,
atk_range = 4,
atk = 100,
hp = 240,
exp = 500,
def = 5,
imgs = {
[1] = {' ',
' ◢█◣ ',
' ██●◣◢◣ ',
' ◥●██◣◥ ',
' ◣◥███◣█ ',
' ◥◤◥█◤◥◤ ',
' ◢◤ ',
' █ ',
},
},
},
[3] = {
name = "史萊姆王",
mov_range = 3,
atk_range = 4,
atk = 20,
hp = 1000,
exp = 300,
def = 5,
imgs = {
[1] = {
' ' , ' ',' ',' ',
' *[0;30;44m◤*[m◣ ',
' *[0;30;44m◤ *[37m◥*[m◣ ',
' *[1;33;44m ⊙⊙ *[m ',
' *[0;30;44m◣*[31m ︶ *[m◤ ',
},
},
},
[4] = {
name = "火星人",
mov_range = 3,
atk_range = 4,
atk = 10,
hp = 500,
exp = 200,
def = 5,
imgs = {
[1] = {
' ',' ', ' ',
' ○||||||| ',
' ╰(⊙ ⊙)╮ ',
' ( )○ ',
' ╭╯|||╰╮ ',
},
},
},
}
fp = {
name,
hp, hpmax,
mp, mpmax,
def,
plocx, plocy = 10,
lv = 1,
str = 4, con = 4,
dex = 4, int = 4,
luk = 4, cha = 1,
def = 2,
use_def = 0,
wp_sk,
wp_sk_lv,
imgs ={},
}
fmob = {
index,
name,
hp, hpmax,
mp, mpmax,
atk,
def,
ar,
locx,
exp,
imgs,
atk_range,
mov_range,
stat,
stat_index,
}
movex1 = 0
movex2 = 0
cline = ""
for i = 1 , 40 do
cline = cline .. " "
end
-- ========================================================================
function deepcopy(object)
local lookup_table = {}
local function _copy(object)
if type(object) ~= "table" then
return object
elseif lookup_table[object] then
return lookup_table[object]
end
local new_table = {}
lookup_table[object] = new_table
for index, value in pairs(object) do
new_table[_copy(index)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end
-- ========================================================================
-- ANSI轉換函數
function ConvertANSI(s)
return (s:gsub("%*(%[[%d;]*m)", string.char(27).."%1"))
end
-- ========================================================================
-- abs 函數
function abs(x)
if x > 0 then
x = x - x - x
return x
end
end -- end function abs
-- ========================================================================
-- abs 函數
function int(x)
x = math.floor(x)
return x
end -- end function int
-- ========================================================================
-- list
function clamp(val, min, max)
if val < min then return min
elseif val > max then return max
else return val
end
end
-- --- class ListBox -----
ListBox = {}
ListBox.prototype = {
items = {},
selectionFinished = false,
selectedIndex = 1,
borderStyle = {
upperLeft = '+', upper = '-', upperRight = '+',
left = '|', right = '|',
bottomLeft = '+', bottom = '-', bottomRight = '+'
},
x = 0, y = 0,
}
ListBox.metatable = {
__index = ListBox.prototype
}
function ListBox:new(o)
local obj = o or {}
setmetatable(obj, ListBox.metatable)
return obj
end
function ListBox.prototype:getSelectedItem()
return self.items[self.selectedIndex]
end
function ListBox.prototype:handleInput()
c = bbs.getch()
if c == 'UP' then
self.selectedIndex = self.selectedIndex - 1
self.selectedIndex = clamp(self.selectedIndex, 1, #(self.items))
elseif c == 'DOWN' then
self.selectedIndex = self.selectedIndex + 1
self.selectedIndex = clamp(self.selectedIndex, 1, #(self.items))
elseif c == 'ENTER' then
self.selectionFinished = true
end
end
function ListBox.prototype:show()
self.selectionFinished = false
local maxLength = 0
for __, v in ipairs(self.items) do
local length = string.len(v)
if maxLength < length then
maxLength = length
end
end
local border = self.borderStyle
local repTimes = math.ceil(maxLength / string.len(border.upper))
local innerWidth = repTimes * string.len(border.upper)
repeat
local y = self.y
local x = self.x
bbs.move(y, x)
bbs.outs(border.upperLeft
.. string.rep(border.upper, repTimes)
.. border.upperRight)
y = y + 1
for i = 1, #(self.items) do
local item = self.items[i]
local fillWidth = innerWidth - string.len(item)
bbs.move(y, x)
bbs.outs(border.left)
if i == self.selectedIndex then bbs.color(7) end
bbs.outs(item .. string.rep(' ', fillWidth))
bbs.color()
bbs.outs(border.right)
y = y + 1
end
bbs.move(y, x)
bbs.outs(border.bottomLeft
.. string.rep(border.bottom, repTimes)
.. border.bottomRight)
self:handleInput()
until self.selectionFinished
end
-- ========================================================================
-- 自製title 函數
function funtitle(str)
bbs.move(1,1)
bbs.color(1,37,46)
bbs.outs("【" , str,"】")
bbs.color()
end -- end function title
-- ========================================================================
-- 判斷hp mp 副程式
function sub_check_hp()
mimicat.hpmax = (mimicat.con + magic.con)* 30 + mimicat.lv * 10 + 10
mimicat.mpmax = (mimicat.int + magic.int)* 15 + mimicat.lv * 10 + 20
if mimicat.hp >= mimicat.hpmax then mimicat.hp = mimicat.hpmax end
if mimicat.mp >= mimicat.mpmax then mimicat.mp = mimicat.mpmax end
end -- end function check hp
-- ========================================================================
-- 同msgbox ( 字串 , y座標 , x座標)
function msgbox(msgstr,l_y,l_x)
local i
local n
local tn
local selectindex = 1
bbs.color()
bbs.kbreset()
bbs.move(l_y,l_x)
if #msgstr <= 12 then tn = 12 else tn = #msgstr + 7 end
bbs.rect(5,tn + 1)
if tn % 2 == 1 then tn = tn + 1 end
drawBoundary(l_x, l_x + tn , l_y, l_y + 6)
bbs.move(l_y + 1,l_x + 2)
bbs.outs(" ",msgstr)
bbs.move(l_y + 3,l_x + 2)
bbs.outs(" Yes")
bbs.move(l_y + 4,l_x + 2)
bbs.outs(" No")
bbs.color(1,36)
bbs.move(l_y + 2 + selectindex ,l_x + 2)
bbs.outs("→")
bbs.move(23,79)
repeat
if bbs.kbhit(1) then
char = bbs.getch()
if bbs.clock() - last_update > 0.1 then
if char == 'UP' then
bbs.move(l_y + 2 + selectindex ,l_x + 2)
bbs.outs(" ")
selectindex = 1
elseif char == 'DOWN' then
bbs.move(l_y + 2 + selectindex ,l_x + 2)
bbs.outs(" ")
selectindex = 2
elseif char == 'ENTER' then
bbs.rect(5,tn + 1)
bbs.color()
return selectindex
end
bbs.move(l_y + 2 + selectindex ,l_x + 2)
bbs.outs("→")
bbs.move(24,79)
last_update = bbs.clock()
end
end
bbs.move(24,79)
until (gamefin == 1)
end -- end function
-- ========================================================================
-- 顯示戰鬥時敘述
function sub_show_msg(str_msg,nlocy,nlocx)
bbs.color()
bbs.move(nlocy,0)
bbs.print(cline)
bbs.color()
bbs.move(nlocy,nlocx)
bbs.print(str_msg)
end
-- ========================================================================
-- draw lines image 畫出圖型
function draw_img(img, x, y)
local i = 0
for key, value in ipairs(img) do
-- bbs.move(y + i, x)
bbs.move(y + i, x)
value = ConvertANSI(value)
bbs.addstr(value)
i = i + 1
end
bbs.refresh()
bbs.move(24,80)
end --end function drawinmage
-- ========================================================================
-- draw lines image 畫出圖型(限制locy的範圍,超出不畫)
function draw_img_d(img, x, y , y_start,y_end)
local i = 0
local n = 0
for key, value in ipairs(img) do
-- bbs.move(y + i, x)
n = y + i
bbs.move(n, x)
value = ConvertANSI(value)
if n >= y_start and n <= y_end then
bbs.addstr(value)
end
i = i + 1
end
bbs.refresh()
bbs.move(23,79)
end --end function drawinmage
-- ========================================================================
-- 繪製出地圖上的 npc
function draw_npc_in_map()
if gamefin == 1 then return -1 end
local i = 0
for i = 1 , npc.count do
local n1 = mimicat.x - npc.npc[i].locx
local n2 = mimicat.y - npc.npc[i].locy
-- 出現在螢幕範圍內再繪製
if (n1 > -5 and n1 < 5) and (n2 > -2 and n2 < 3) then
draw_img(npc.npc[i].img[1], 35 - n1 * 8, 9 - n2 * 4)
end
end
end -- end function npc
-- ========================================================================
-- 頭上跳出level up動畫副程式 & 動畫處理 (傳入值,字串&文字顏色
function draw_show_get(showstr,ncolor)
for i = 1 , 4 do
bbs.color(1,ncolor);
bbs.move(mimicat.plocy - i,mimicat.plocx + 2)
bbs.outs(showstr)
bbs.move(23,79)
bbs.sleep(0.3)
bbs.color();bbs.move(mimicat.plocy - i,mimicat.plocx + 2)
bbs.outs(" ")
end
bbs.move(23,79)
end -- end function
-- ========================================================================
-- 戰鬥時隱身或現身 1 隱身 其他 現身
function draw_hide_mimicat(hide_index)
local i
if hide_index == 1 then
for i = 1 , 4 do
if i == 1 then bbs.color(1,36,40) end
if i == 2 then bbs.color(1,37,40) end
if i == 3 then bbs.color(1,30,40) end
if i == 4 then bbs.color(0,30,40) end
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
bbs.sleep(0.3)
end
bbs.move(mimicat.plocy,mimicat.plocx)
bbs.rect(4,12)
else
for i = 1 , 4 do
if i == 1 then bbs.color(0,30,40) end
if i == 2 then bbs.color(1,30,40) end
if i == 3 then bbs.color(1,37,40) end
if i == 4 then bbs.color() end
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
bbs.sleep(0.3)
end
end
end -- function hide_mimicat
-- ========================================================================
-- 畫出地圖 8
-- 00 1 2 4
function draw_map()
local tempmap = {}
local i = 0 ; local j = 0;
for i = 1, 9 do
for j = 1 , 4 do
local tempn1 = (j - 1) * 4
local tempn2 = (i - 1) * 8 + 2
local locx = mimicat.y - 3 + j
local locy = mimicat.x - 5 + i
if locx < 0 then locx = 1 end
if locy < 0 then locy = 1 end
if map01[locx][locy] == 09 then
tempmap[1] = " "
tempmap[2] = "─┐ "
tempmap[3] = " │ "
tempmap[4] = " │ "
elseif map01[locx][locy] == 07 then
tempmap[1] = " "
tempmap[2] = " ┌──"
tempmap[3] = " │ "
tempmap[4] = " │ "
elseif map01[locx][locy] == 04 then
tempmap[1] = " │ "
tempmap[2] = " │ "
tempmap[3] = " │ "
tempmap[4] = " │ "
elseif map01[locx][locy] == 03 then
tempmap[1] = " │ "
tempmap[2] = "─┘ "
tempmap[3] = " "
tempmap[4] = " "
elseif map01[locx][locy] == 02 then
tempmap[1] = "*[1;32;42m \' \" *[m"
tempmap[2] = "*[1;32;42m \" \' *[m"
tempmap[3] = "*[1;32;42m \' \" *[m"
tempmap[4] = "*[1;32;42m \' \" *[m"
elseif map01[locx][locy] == 59 then
tempmap[1] = "*[1;36;44m~ - - ~ *[m"
tempmap[2] = "*[1;36;44m ~ ~ - ~*[m"
tempmap[3] = "*[1;36;44m ~ - ~ *[m"
tempmap[4] = "*[1;36;44m ~ - - ~ *[m"
elseif map01[locx][locy] == 51 then
tempmap[1] = "*[0;30;47m┬┴┬┴*[m"
tempmap[2] = "*[0;30;47m┴┬┴┬*[m"
tempmap[3] = "*[0;30;47m┬┴┬┴*[m"
tempmap[4] = "*[0;30;47m┴┬┴┬*[m"
elseif map01[locx][locy] == 52 then
tempmap[1] = "*[0;30;47m┴┬┴┬*[m"
tempmap[2] = "*[1;33;42m [7-11] *[m"
tempmap[3] = "*[0;30;42m 商店 *[m"
tempmap[4] = "*[0;30;47m┴┬┴┬*[m"
elseif map01[locx][locy] == 53 then
tempmap[1] = "*[0;30;47m┴┬┴┬*[m"
tempmap[2] = "*[1;33;42m [INN] *[m"
tempmap[3] = "*[0;30;42m 旅館 *[m"
tempmap[4] = "*[0;30;47m┴┬┴┬*[m"
elseif map01[locx][locy] == 61 then
tempmap[1] = "*[0;30;43m┬┴┬┴*[m"
tempmap[2] = "*[0;30;43m┴┬┴┬*[m"
tempmap[3] = "*[0;30;43m┬┴┬┴*[m"
tempmap[4] = "*[0;30;43m┴┬┴┬*[m"
elseif map01[locx][locy] == 62 then
tempmap[1] = "*[0;30;43m┴┬┴┬*[m"
tempmap[2] = "*[1;33;47m [7-11] *[m"
tempmap[3] = "*[0;30;47m 商店 *[m"
tempmap[4] = "*[0;30;43m┴┬┴┬*[m"
elseif map01[locx][locy] == 63 then
tempmap[1] = "*[0;30;43m┴┬┴┬*[m"
tempmap[2] = "*[1;33;47m [INN] *[m"
tempmap[3] = "*[0;30;47m 旅館 *[m"
tempmap[4] = "*[0;30;43m┴┬┴┬*[m"
else
tempmap[1] = " "
tempmap[2] = " "
tempmap[3] = " "
tempmap[4] = " "
bbs.color()
end
bbs.move( tempn1 + 1 , tempn2+ 1)
bbs.outs(ConvertANSI(tempmap[1]))
-- bbs.outs(i,",",j)
-- bbs.outs("123456789abcdef")
bbs.move( tempn1 + 2 , tempn2+ 1)
bbs.outs(ConvertANSI(tempmap[2]))
bbs.move( tempn1 + 3 , tempn2+ 1)
bbs.outs(ConvertANSI(tempmap[3]))
bbs.move( tempn1 + 4 , tempn2+ 1)
bbs.outs(ConvertANSI(tempmap[4]))
tempmap[1] = " "
tempmap[2] = " "
tempmap[3] = " "
tempmap[4] = " "
end -- next j
end -- next i
end --end function map
-- ========================================================================
-- 選擇標題畫面
function sub_start_select()
local out_i
bbs.clear()
bbs.move(6,30)
bbs.outs("BBS RPG")
local x1 = 12
local y1 = 12
bbs.move(y1,x1)
bbs.outs("1 新的故事")
bbs.move(y1+2,x1)
bbs.outs("2 繼續旅程")
bbs.move(y1+4,x1)
bbs.outs("3 結束冒險")
bbs.move(23,79)
repeat
if bbs.kbhit(1) then
char = bbs.getch()
-- should we update the mimicat?
if bbs.clock() - last_update > move_speed then
if char == '1' then
out_i = 1
elseif char == '2' then
sub_load_game()
elseif char == '3' then
out_i = 1
gamefin = 1
end
last_update = bbs.clock()
end
end
until (out_i == 1)
end -- function game logo
-- ========================================================================
-- 進入遊戲進度
function sub_load_game()
bbs.move(1,1)
-- str = bbs.getdata(60)
string = "7a647d"
string = "79647d"
local charstr = encrypt(string, bbs.userid);
bbs.outs("show",charstr)
bbs.pause()
end -- function
-- ========================================================================
function encrypt(input, key)
bbs.outs(key)
for i = 1,#key do
-- bbs.outs("rerwe",string.asc(i))
end
end
-- ========================================================================
function decrypt(input, key)
local output = "";
local ix = 1;
for i = 1, (#input)/2 do
local c = tonumber("0x" .. string.sub(input,(i-1)*2+1,i*2)); -- get singlebyte
local d = string.byte(string.sub(key,ix,ix));
ix = (ix % #key) +1;
output = output .. string.format("%c", bit.bxor(c,d));
end
return output;
end
-- ========================================================================
-- 繪製商店
function draw_store()
bbs.clear()
-- 自制title function (因為bbs.title使用後無法取消)
funtitle(storeimgs.name[1])
bbs.kbreset();
bbs.move(1,45)
bbs.color()
bbs.rect(16,32)
bbs.color(0,37,40)
drawBoundary(45, 79, 1, 16)
bbs.move(1,45);bbs.outs("┌────────┬──────┐")
bbs.move(2,45);bbs.outs("│ 買進 │ 賣 │")
bbs.move(3,45);bbs.outs("│ └──────┤")
-- 繪畫商店的圖
draw_img(storeimgs.imgs[1], 4, 4)
draw_start()
end -- end function draw_store
-- ========================================================================
-- 繪製道具視窗
function draw_item_window()
local ty
local tx
local tn
bbs.clear()
-- 自制title function (因為bbs.title使用後無法取消)
bbs.kbreset();
bbs.move(1,1)
bbs.color()
bbs.rect(16,32)
drawBoundary(1, 43, 1, 16)
-- 繪製人物圖欄
drawBoundary(3, 17, 2, 8)
-- 繪製出mimicat
draw_img(mimicat.imgs[mimicat.img_i], 6, 3)
bbs.color()
drawBoundary(45, 79, 1, 16)
ty = 8;tx = 5
-- ******************************************
bbs.move(ty + 1, tx)
tn = mimicat.str + magic.str
if tn < 0 then tn = 0 end
tm = fun_check_magic_show_color(magic.str)
bbs.outs(ConvertANSI("力量 (Str): "..tn..tm))
bbs.move(ty + 2, tx)
tn = mimicat.dex + magic.dex
if tn < 0 then tn = 0 end
tm = fun_check_magic_show_color(magic.dex)
bbs.outs(ConvertANSI("敏捷 (Dex): "..tn..tm))
bbs.move(ty + 3, tx)
tn = mimicat.con + magic.con
if tn < 0 then tn = 0 end
tm = fun_check_magic_show_color(magic.con)
bbs.outs(ConvertANSI("體質 (Con): "..tn..tm))
bbs.move(ty + 4, tx)
tn = mimicat.int + magic.int
if tn < 0 then tn = 0 end
tm = fun_check_magic_show_color(magic.int)
bbs.outs(ConvertANSI("智力 (Int): "..tn..tm))
bbs.move(ty + 5, tx)
tn = mimicat.cha + magic.cha
if tn < 0 then tn = 0 end
tm = fun_check_magic_show_color(magic.cha)
bbs.outs(ConvertANSI("魅力 (Cha): "..tn..tm))
bbs.move(ty + 6, tx)
tn = mimicat.def + magic.def
if tn < 0 then tn = 0 end
tm = fun_check_magic_show_color(magic.def)
bbs.outs(ConvertANSI("防禦 (Def): "..tn..tm))
ty = 8;tx = 26
bbs.move(ty + 1, tx)
bbs.outs("移動距離: ",mimicat.move_range + magic.mov_range," ")
bbs.move(ty + 2, tx)
tn = mimicat.act_range + magic.atk_range + mimicat.wp_range
bbs.outs("攻擊範圍: ", tn ," ")
bbs.move(ty + 3, tx)
bbs.outs("增加傷害: ",magic.dmg," ")
bbs.move(ty + 4, tx)
bbs.outs("吸取體力: ",magic.ah,"% ")
bbs.move(ty + 5, tx)
bbs.outs("吸取魔力: ",magic.am,"% ")
bbs.move(ty + 6, tx)
bbs.outs("增加經驗: ",magic.addexp,"% ")
draw_start()
bbs.pause()
bbs.color()
bbs.clear()
draw_start()
draw_map()
-- 繪製地圖上的npc
draw_npc_in_map()
map_walk()
end -- end function item windows
-- ========================================================================
-- 確認增加的魔法屬性是正的還是負的 正 黃色 0 白色 負 紅色
-- 傳入值 增加的屬性值(數字) 傳出值 *[1;33m+數字
function fun_check_magic_show_color(magicnum)
local temp = ""
if magicnum == nil then return -1 end
if magicnum == 0 then
elseif magicnum > 0 then
temp = "(*[1;33m+"..magicnum.."*[m) "
elseif magicnum < 0 then
temp = "(*[0;31m"..magicnum.."*[m) "
end
return temp
end
-- ========================================================================
-- 玩家選擇
function sub_act_play_change_load(i_n)
if i_n == 1 then
fp.name = mimicat.userid
fp.lv = mimicat.lv
fp.hp = mimicat.hp
fp.mp = mimicat.mp
fp.hpmax = mimicat.hpmax
fp.mpmax = mimicat.mpmax
fp.def = mimicat.def
fp.plocx = mimicat.plocx
fp.plocy = mimicat.plocy
fp.str = mimicat.str
fp.con = mimicat.con
fp.dex = mimicat.dex
fp.int = mimicat.int
fp.luk = mimicat.luk
fp.cha = mimicat.cha
fp.wp_type = mimicat.wp_type
fp.wp_sk = mimicat.wp_sk
fp.wp_sk_lv = mimicat.wp_sk_lv
fp.imgs = micat.imgs
end
end
-- ========================================================================
-- 繪出戰鬥開場動畫
function draw_fight()
local tm = ""
local line2 = ""
bbs.kbreset()
-- 給予怪物屬性
i = fmob.index
fmob.name = mob[i].name
fmob.hp = mob[i].hp
fmob.hpmax = mob[i].hp
fmob.exp = mob[i].exp
fmob.atk = mob[i].atk
fmob.def = mob[i].def
fmob.imgs = mob[i].imgs[1]
fmob.atk_range = mob[i].atk_range
fmob.mov_range = mob[i].mov_range
fmob.locx = 62
fmob.y = 6
-- 給予玩家屬性
fp.hp = mimicat.hp
fp.mp = mimicat.mp
sub_act_play_change_load(i_n)
-- draw_img(mob[1].imgs[1],4,4)
-- draw_img(fmob.imgs,5,4)
-- bbs.pause()
for i = 1 , 40 do
line2 = line2 .. "▄"
end
-- 戰鬥畫面開場
bbs.color()
for i = 1 , 6 do
bbs.color()
bbs.move(8 - i + 1, 0);bbs.outs(cline)
bbs.move(8 + i - 1, 0);bbs.outs(cline)
bbs.color(47)
bbs.move(8 - i , 0);bbs.outs(cline)
bbs.move(8 + i , 0);bbs.outs(cline)
bbs.sleep(0.1)
end
bbs.color()
bbs.move(3 , 0);bbs.outs(cline)
bbs.color(1,34,44)
bbs.move(2 , 0);bbs.outs(line2)
bbs.color()
bbs.color();bbs.move(2,28)
tm = "【 " ..bbs.userid.. " VS " ..fmob.name
if string.len(tm) % 2 == 0 then tm = tm .. "】" else tm = tm .. " 】" end
bbs.outs(tm)
bbs.move(16,0);bbs.outs(cline)
bbs.move(16,3);bbs.outs("A 普通攻擊 / S 特殊技 / D 防禦 / Q 逃跑")
bbs.color()
end -- end function show
-- ========================================================================
-- 繪製戰鬥時可行走之範圍 & 限制行走範圍
function draw_fight_move_range()
local n
local n2
bbs.color(46)
n = ((mimicat.move_range + magic.mov_range)* 2) + 4
for i = 1 , n do
n2 = (mimicat.plocx - (mimicat.move_range + magic.mov_range)* 2 + 4) + i * 2
if n2 < 0 then n2 = 0 end
if n2 > 78 then n2 = 78 end
bbs.move(14 , n2)
bbs.outs("= ")
end
bbs.color()
movex1 = (mimicat.plocx + (mimicat.move_range + magic.mov_range)* 2)
movex2 = (mimicat.plocx - (mimicat.move_range + magic.mov_range)* 2 + 4)
if movex2 < 0 then movex2 = 0 end
end
-- ========================================================================
-- 繪製怪物戰鬥時可行走之範圍
function draw_mob_move_range()
local n
local n2
bbs.color(46)
n = (fmob.mov_range * 2) + 4
for i = 1 , n do
n2 = (fmob.locx - fmob.mov_range* 2) + i * 2
if n2 < 0 then n2 = 0 end
if n2 > 78 then n2 = 78 end
bbs.move(14 , n2)
bbs.outs("= ")
end
bbs.move(23,79)
bbs.color()
end
-- ========================================================================
-- 繪製mimicat 手上武器
function draw_mimicat_wp(plocx)
local temp
if mimicat.wp_type == "dagger" then
temp = " O︳ ︱O+- "
elseif mimicat.wp_type == "sword" then
temp = " <︳ ︱O← "
elseif mimicat.wp_type == "spear" then
temp = " O┼─┼O→ "
elseif mimicat.wp_type == "hammer" then
temp = " O┼─┼O□ "
elseif mimicat.wp_type == "bow" then
temp = " <︳ ┼} "
elseif mimicat.wp_type == "axe" then
temp = " O┼─┼OⅡ "
elseif mimicat.wp_type == "staff" then
temp = " /︳ ╞O=- "
elseif mimicat.wp_type == "" then
temp = " O︳ ╞O "
end
bbs.move(mimicat.plocy + 2,plocx)
bbs.outs(temp)
bbs.move(23,79)
end
-- ========================================================================
-- 繪製怪物的血量表情 (怪物的剩餘血量以表情來表達)
function draw_mob_hp_img()
local n
local temp
n = (fmob.hp / fmob.hpmax) * 100
bbs.color()
if n >= 90 then
bbs.color(1,32)
temp = " (▔▽▔ ) "
elseif n >= 80 then
bbs.color(1,36)
temp = " (ㄧ︵ㄧ#) "
elseif n >= 60 then
bbs.color(1,33)
temp = " (⊙▁⊙;) "
elseif n >= 40 then
bbs.color(1,35)
temp = " (☆▁☆ ) "
elseif n >= 20 then
bbs.color(37)
temp = " (′O‵;) "
elseif n > 0 then
bbs.color(33)
temp = " (> ︹ <;) "
elseif n <= 0 then
bbs.color(31)
temp = " (ㄨQㄨ ) "
end
bbs.move(3,68)
bbs.outs(temp)
bbs.color()
bbs.move(23,79)
end -- end function mob_image
-- ========================================================================
-- 繪製戰鬥中光箭動畫(1 光箭 2 普通箭 3 穿心箭)
function sub_show_light_bolt(i_n)
local temp
local t_img
local tc
if i_n == 1 then
temp = "光箭 (light bolt)"
t_img = ">>"
tc = 36
elseif i_n == 2 then
temp = "箭矢 "
t_img = "->"
tc = 37
elseif i_n == 3 then
temp = "穿心箭 (magnum shot)"
t_img = "→"
end
-- 顯示目前字串
sub_show_msg(temp,4,24)
bbs.sleep(1)
draw_start()
for i = 1, (fmob.locx - mimicat.plocx - 10 )/ 2 do
if i_n == 3 then tc = math.random(7) + 30 end
bbs.color(1,tc,40)
bbs.move(mimicat.plocy + 2 ,mimicat.plocx + 10 + i*2)
bbs.outs(" "..t_img)
bbs.move(23,79)
bbs.sleep(0.1)
end
bbs.color()
-- 繪出怪物立姿
draw_img(fmob.imgs, fmob.locx, fmob.y)
end -- end function draw_atk_show_light_bolt
-- ========================================================================
-- 畫出表格
function drawBoundary(xStart, xEnd, yStart, yEnd)
if xStart>xEnd-4 or yStart>yEnd-2 or xStart<0 or yStart<0 then
return nil, nil, nil, nil;
end
local previousY, previousX = bbs.getyx();
bbs.move(yStart, xStart);
bbs.addstr('┌');
bbs.move(yStart, xEnd-2);
bbs.addstr('┐');
bbs.move(yEnd-1, xStart);
bbs.addstr('└');
bbs.move(yEnd-1, xEnd-2);
bbs.addstr('┘');
local xPointer;
for xPointer = xStart+2, xEnd-4, 2 do
bbs.move(yStart,xPointer);
bbs.addstr('─');
bbs.move(yEnd-1, xPointer);
bbs.addstr('─');
end
local yPointer;
for yPointer = yStart+1, yEnd-2 do
bbs.move(yPointer, xStart);
bbs.addstr('│');
bbs.move(yPointer, xEnd-2);
bbs.addstr('│');
end
bbs.move(previousY, previousX);
return xStart+2, xEnd-2, yStart+1, yEnd-1
end --drawBoundary
-- ========================================================================
-- 繪製主表單狀態欄
function draw_start()
drawBoundary(1, 79, 17, 23);
bbs.move(18,5);
bbs.outs("I 道具");
bbs.move(19,5);
bbs.outs("S 技能");
bbs.move(20,5);
bbs.outs("P 戰鬥方針:");
bbs.move(21,5);
bbs.outs("按下Ctrl+C離開");
bbs.move(20,16);
bbs.color(1,37);
if fight_mode == 1 then bbs.outs("手動戰鬥 ") end
if fight_mode == 2 then bbs.outs("自動戰鬥 ") end
if fight_mode == 3 then bbs.outs("安全第一 ") end
if fight_mode == 4 then bbs.outs("跑為上策 ") end
bbs.color()
-- hp/mp判斷副程式
sub_check_hp()
bbs.move(18,30);
bbs.outs("LV: ",mimicat.lv," ");
bbs.move(19,30);
bbs.outs("Exp: ",mimicat.exp,"/",mimicat.lv^2*100," ");
bbs.move(20,30);
bbs.outs("HP: ",mimicat.hp,"/",mimicat.hpmax," ");
bbs.move(21,30);
bbs.outs("MP: ",mimicat.mp,"/",mimicat.mpmax," ");
bbs.move(18,50);
bbs.outs("Gold: ",gold," ");
end -- end function
-- ========================================================================
-- 繪製旅館休息動畫(休息模式 1 休息 2 睡覺 3 叫小姐)
function draw_inn_resting(rest_mode)
local i
local n = 0
local j = 0
local temp = ""
local local_imgs = {
[0] = {
' ',
'
◢ ◥ ',
'
◢ ◥ 寶',
'
◢ ◥ ',
'
*[44m ╮╮╮╭╭ ╮╮╭╭╭ *[30m 貝 一',
'
◢█◣◢█◣ ╭──╮ ╭──╮ ',
'
██████ │╭╮│ │╭╮│ ! 起',
'
██████ │╰╯│ │╰╯│ ',
'
◥████◤ ╰──╯ ╰──╯ 來',
'
◥██◤ ◥██◤◥██◤◥██◤ ',
'
◥◤ ◢██◣ ◥◤ ◥◤ ◥◤ ◢██◣ ╯ 玩',
'
████ ████ ',
'
████ ████ 嘛',
'
╰─╮ ◥██◤ ◥██◤ ╭─╯ ',
'
╰ ╯ ! ',
'
◢◣ ◢◣ ◢◣ ',
'
◢██◣◢██◣◢██◣ ',
'
◥ ╲ ◢◣ ◢◣ ╱ ◢ ',
'
◥ ╲╴╴╴◢██◣╴╴╴╴◢██◣╴╴╴╱ ◢ ',
'
◥ ◢ ',
'
◥ ◢',
},
[1] = {
' ',
'
▁▂▃▂ ',
'
▆▃_ ◢▂▅▆◣ ◣ ',
'
◣ *[44m *[33;47m◤ ▆▄*[33mb◣ ◣ ',
' O
▎ ▉ / \\ ',
' r
\\_ ▏ ▎ ▎ ',
' a
*[40m *[30;44m▊ ◢ / ',
' n
*[40m *[30;44m▉ ',
' g
◣▉ _▄█ ◢ *[30m` ',
' e
▏ ◣◥_▁▄▆ / ▏ ',
' Y
▍ ◣ ▅▄▁ ▁_ ',
' u◥
▎ ◢▍ ▎ ▆ ',
' ◥
_◢ ▋ *[35mn *[44m \\▍ ▍ ',
'
▉ _*[37m *[43m▊ *[43ml ▋ ',
'
◤ ▋ ▋▍ ',
'
▊ ▍ _ ▅_\\▎ ',
'
▉ ◢ ◣ ◥ ◤ ▏ \\▍ ',
'
_◢ ◣ \\ / *[43m ',
'
▉ ◣▎\\ _▃ / ',
'
◥ *[43me▃▅▆ ▍ ▎ ',
'
*[47m* [45m _▂▅▃_
◤ ',
'
▎ ▆▄▆ *[37m *[33m_▃▆▅/ ',
'
◢\\ _▂▃▅ ▎*[43mc \\ ',
},
[2] = {' ',
'
▍ *[43me▍◥∥ ▌ ◥W\\◣ ',
'
▎▍▎ \\▂▁_ \\◣ ▉ ',
'
▋▋▍▁ ◤“
/▎▎\\ ▋ ',
'
▋{ *[43mk *[40m *[1;37m / ` ▆
▉ █▍▎█',
'
▍▎|▎\'*[0;47m
﹑ █▎◥\\ ',
'
▌ *[43mk{ *[37me ︸ / ◣ ▍◤ ▅',
'
▊ ▎▎\\◥ _=▎( ◥▎ ',
'
\' ▍◥\\W ▅*[37m *[m ▎ ▌ ▅',
'
/ ▍WV ▋
▍ ▋
▎ *[1;46m',
'
▍\\▎ ▍
∥ *[46m *[1;30mL,▎ ',
'
▍ ▍ *[30m _▃*[46m / *[ml',
' ◥▊
▎ ▉
▎◢ N/ ▏▎',
'
▉ *[0;30mn *[47m *[33m,▄ *[46m V/ *[36mH∥ ▄▂_ ▂▄ *[36m▂,',
'
/ \' ▊ ∕ Nㄟ. ◣▄▇◤ ◢ *[43me◤ ▆ *[30md',
'
▕ ▋ *[36;40m *[1;30;46m w ,V *[40me █/ ◣',
'
\ *[46m *[1m ^ ∕\\ ▎◢ ▎',
'
▉ ▄*[33me▅
/ *[36m *[1;30m ^` ▌◤ ▏',
'
▏ ▊ *[46m v" ▉ *[47m ▊▎',
'
▎ /▆▃▂_ |▏ ▎▍',
'
▋ ▊ ▏ .V▏ ▅▃ ◤ ▎▊',
'
▌ ▊ N ▆▃ *[43mf ▍',
'
▎ *[30m *[36;40m▏ ◢ ▋ ',
},
}
-- 繪出商店的圖 , 將場景變暗
bbs.color(1,37);draw_img(storeimgs.imgs[1], 4, 4);bbs.sleep(0.3)
bbs.color();draw_img(storeimgs.imgs[1], 4, 4);bbs.sleep(0.3)
bbs.color(1,30);draw_img(storeimgs.imgs[1], 4, 4);bbs.sleep(0.3)
bbs.color(0,30);draw_img(storeimgs.imgs[1], 4, 4);bbs.sleep(0.5);bbs.color()
bbs.move(2,1);bbs.rect(15,43)
if rest_mode == 1 then temp = "QK " end
if rest_mode == 2 then temp = "Zzz " end
if rest_mode == 3 then
j = math.random(6)
if j == 1 then temp = "......" end
if j == 2 then temp = "救命呀" end
if j == 3 then temp = "扛爸爹" end
if j == 4 then temp = "咦~~爹" end
if j == 5 then temp = "烏龍爹" end
if j == 6 then temp = "亞美爹" end
end
-- function draw_img_d(img, x, y , y_start,y_end)
if j == 2 then n = 0 else n = math.random(2) end
if rest_mode == 3 then
for i = 15 , 1 , -1 do
draw_img_d(local_imgs[n], 0, i - 3 ,2, 16)
bbs.sleep(0.1)
end
-- 強調作者id
bbs.sleep(2)
bbs.color(32,47);bbs.move(16,52)
if n == 0 then bbs.outs(" ascii by ptt cafelife ") end
if n == 1 then bbs.outs(" ascii by 無名 OrangeYu ") end
if n == 2 then bbs.outs(" ascii by 無名 OrangeYu ") end
bbs.sleep(1.5);bbs.color()
end
for i = 1 , 9 do
bbs.move(24,79)
if j == 1 then bbs.sleep(0.1) else bbs.sleep(0.3) end
bbs.move(4 + i,math.random(4,64))
bbs.outs(temp)
end
bbs.move(23,79)
if j == 1 and rest_mode == 3 then
bbs.sleep(3)
bbs.move(5,15);bbs.outs("結束了喔?");bbs.sleep(1.5)
bbs.move(6,15);bbs.outs(bbs.userid .. ":.....");bbs.sleep(1)
end
bbs.sleep(0.5)
-- 以下是起床
bbs.move(2,0);bbs.rect(15,80)
-- 繪出商店的圖 , 將場景變亮
if rest_mode == 3 then funtitle("龍門大賓館") end
bbs.color(1,30);draw_img(storeimgs.imgs[1], 4, 4);bbs.sleep(0.3)
bbs.color(0,33);draw_img(storeimgs.imgs[1], 4, 4);bbs.sleep(0.3)
bbs.color(1,37);draw_img(storeimgs.imgs[1], 4, 4);bbs.sleep(0.3)
bbs.color();draw_img(storeimgs.imgs[1], 4, 4)
bbs.kbreset()
return j
end
-- ========================================================================
-- 在地圖上行走
function map_walk()
if gamefin == 1 then return -1 end
-- 繪製出mimicat
draw_img(mimicat.imgs[mimicat.img_i], 35, 9)
bbs.move(23,79)
-- bbs.refresh()
if bbs.kbhit(1) then
char = bbs.getch()
-- should we update the mimicat?
if bbs.clock() - last_update > move_speed then
backx = 0;backy = 0
if char == 'UP' then
mimicat.y = mimicat.y - 1;backx = 0;backy = 1
elseif char == 'DOWN' then
mimicat.y = mimicat.y + 1;backx = 0;backy = -1
elseif char == 'LEFT' then
mimicat.x = mimicat.x - 1;backx = 1;backy = 0
elseif char == 'RIGHT' then
mimicat.x = mimicat.x + 1;backx = -1;backy = 0
elseif char == 'q' then
move_speed = 0
else
main_meun_inkey(char)
end
-- 重繪地圖
-- 限制行走範圍 (41 商店 42 旅館)
if map01[mimicat.y][mimicat.x] == 41 then
-- 退回去
mimicat.x = mimicat.x + backx
mimicat.y = mimicat.y + backy
-- item_arr[1] = "ea"
store_mode = 3
select_enter_store(store_mode)
elseif map01[mimicat.y][mimicat.x] == 42 then
-- 退回去
mimicat.x = mimicat.x + backx
mimicat.y = mimicat.y + backy
-- 進入旅館副程式
sub_enter_inn()
elseif map01[mimicat.y][mimicat.x] > 50 then
-- 退回去
mimicat.x = mimicat.x + backx
mimicat.y = mimicat.y + backy
end
-- 判斷有沒有撞到npc
i = 0
for i = 1 , npc.count do
if mimicat.x == npc.npc[i].locx and mimicat.y == npc.npc[i].locy then
-- 退回去
mimicat.x = mimicat.x + backx
mimicat.y = mimicat.y + backy
-- 進入npc 說話function
fun_npc_talk(i)
end
end
if gamefin == 1 then return -1 end
-- 繪製地圖
draw_map()
-- 繪製地圖上的npc
draw_npc_in_map()
-- change image index
mimicat.img_i = mimicat.img_i + 1
if mimicat.img_i > 2 then
mimicat.img_i = 1
end
bbs.move(21,50)
bbs.outs("座標:",mimicat.x,",",mimicat.y," ")
bbs.move(21,60)
bbs.outs("[",map01[mimicat.y][mimicat.x],"] ")
last_update = bbs.clock()
end
else
--超過10秒 變宅
if bbs.clock() - last_update > 20 then
mimicat.img_i = 3
else
mimicat.img_i = 0
end
end
end --end function map_walk
-- ========================================================================
-- 按下方向鍵以外的鍵
function main_meun_inkey(char)
-- 轉換戰鬥模式
if char == 'p' or char == 'P' then
fight_mode = fight_mode + 1
if fight_mode > 4 then fight_mode = 1 end
draw_start()
elseif char == 'd' or char == 'D' then
fmob.index = 2
draw_fight()
fun_fight()
elseif char == 'i' or char == 'I' then
-- 繪製道具視窗
draw_item_window()
elseif char == 't' or char == 'T' then
-- 繪製道具視窗
draw_img(game_imgs[3], 0 , 0)
-- msgbox("test",5,25)
bbs.pause()
end
end -- end function main_inkey
-- ========================================================================
-- 進入旅館副程式
function sub_enter_inn()
local n
local temp = ""
local get_hp
local get_mp
bbs.clear()
-- title
funtitle("龍門客棧")
-- 繪出商店的圖
draw_img(storeimgs.imgs[1], 4, 4)
draw_start()
-- 同msgbox ( 字串 , y座標 , x座標)
-- msgbox(msgstr,l_y,l_x)
box = ListBox:new()
box.x = 50;box.y = 3
local select_item = {
[1] = '休息 300',
[2] = '睡覺 1000',
[3] = '叫小姐 2500',
[4] = '離開',
}
box.items = {select_item[1],select_item[2],select_item[3],select_item[4]}
box:show()
temp = box:getSelectedItem()
-- hp/mp判斷副程式
sub_check_hp()
if temp == select_item[1] then
-- 休息 hp mp + 40%
if gold >= 300 then
gold = gold - 300
-- 繪出休息中動畫
draw_inn_resting(1)
get_hp = int(mimicat.hpmax * 50 / 100)
get_mp = int(mimicat.mpmax * 40 / 100)
mimicat.hp = mimicat.hp + get_hp
mimicat.mp = mimicat.hp + get_mp
-- hp/mp判斷副程式
sub_check_hp()
bbs.sleep(1)
bbs.move(12,50);bbs.outs("休息過後,覺得神清氣爽")
bbs.color(1,32);bbs.move(13,50);bbs.outs("HP +",get_hp)
bbs.color(1,36);bbs.move(14,50);bbs.outs("mp +",get_mp)
bbs.color()
else
bbs.move(12,50);bbs.outs("你的金錢似乎不夠喔")
end
elseif temp == select_item[2] then
if gold >= 1000 then
gold = gold - 1000
-- 繪出休息中動畫
draw_inn_resting(2)
get_hp = mimicat.hpmax - mimicat.hp
get_mp = mimicat.mpmax - mimicat.mp
mimicat.hp = mimicat.hp + get_hp
mimicat.mp = mimicat.hp + get_mp
-- hp/mp判斷副程式
sub_check_hp()
bbs.sleep(1)
bbs.move(12,50);bbs.outs("一覺起來,身體完全回復了")
bbs.color(1,32);bbs.move(13,50);bbs.outs("HP +",get_hp)
bbs.color(1,36);bbs.move(14,50);bbs.outs("mp +",get_mp)
bbs.color()
else
bbs.move(12,50);bbs.outs("你的金錢似乎不夠喔")
end
elseif temp == select_item[3] then
n = msgbox("叫小姐可能會扣血,還要叫嗎? ",3,44)
if n == 1 then
if gold >= 2500 then
gold = gold - 2500
-- 繪出休息中動畫(模式3叫小姐)
n = draw_inn_resting(3)
bbs.sleep(1)
-- n = 2 表示遇到怪獸
if n == 1 then
bbs.color();bbs.move(4,24);bbs.outs("小藥丸可以算你便宜一點")
bbs.color();bbs.move(12,50);bbs.outs("你四周被人投來同情的眼神..")
bbs.color(1,32);bbs.move(13,50);bbs.outs("HP Full ")
bbs.color(1,36);bbs.move(14,50);bbs.outs("MP Full ")
mimicat.hp = mimicat.hpmax
mimicat.mp = mimicat.mpmax
elseif n == 2 then
bbs.color();bbs.move(4,24);bbs.outs("..............")
bbs.move(12,50);bbs.outs("剛從地獄逃出,你現在濱死狀態")
bbs.color(31);bbs.move(13,50);bbs.outs("HP = 1")
bbs.color(31);bbs.move(14,50);bbs.outs("MP = 1")
mimicat.hp = 1
mimicat.mp = 1
else
bbs.color();bbs.move(4,24);bbs.outs("少年耶,很賣力喔")
get_hp = int(mimicat.hpmax * 50 / 100)
get_mp = int(mimicat.mpmax * 40 / 100)
bbs.move(12,50);bbs.outs("雖然很累,但是覺得很爽")
bbs.color(1,32);bbs.move(13,50);bbs.outs("HP +",get_hp)
bbs.color(1,36);bbs.move(14,50);bbs.outs("MP +",get_mp)
end
else
bbs.move(12,50);bbs.outs("你的金錢不夠")
end
else
bbs.move(12,50);bbs.outs("(我還是自己OGC好了...)")
end
elseif temp == select_item[4] then
end
bbs.color()
draw_start()
bbs.pause()
bbs.clear()
draw_start()
end -- function
-- ========================================================================
-- 選擇是否進入商店 store_mode 商店種植 1 武器店 2 道具店 3 inn
function select_enter_store()
bbs.move(23,79)
repeat
if bbs.kbhit(1) then
char = bbs.getch()
-- should we update the mimicat?
if bbs.clock() - last_update > move_speed then
bbs.move(4 + sell_index ,48);bbs.outs(" ")
if char == 'UP' then
sell_index = sell_index - 1
elseif char == 'DOWN' then
sell_index = sell_index + 1
elseif char == 'LEFT' then
sell_mode = 1
sell_index = 1
elseif char == 'RIGHT' then
sell_mode = 2
sell_index = 1
end
if sell_index < 1 then sell_index = 1 end
if sell_index > 9 then sell_index = 9 end
bbs.move(4 + sell_index ,48)
bbs.outs("→")
if sell_mode == 1 then
bbs.move(1,45);bbs.outs("┌────────┬──────┐")
bbs.move(2,45);bbs.outs("│ 買進 │ 賣 │")
bbs.move(3,45);bbs.outs("│ └──────┤")
else
bbs.move(1,45);bbs.outs("┌──────┬────────┐")
bbs.move(2,45);bbs.outs("│ 買 │ 賣出 │")
bbs.move(3,45);bbs.outs("├──────┘ │")
end
bbs.move(24,79)
last_update = bbs.clock()
end
end
until (char == 'Q' or char == 'q')
bbs.pause()
bbs.color()
bbs.clear()
draw_start()
draw_map()
-- 繪製地圖上的npc
draw_npc_in_map()
map_walk()
end -- function select_enter_store
-- ========================================================================
-- 戰鬥副程式
function fun_fight()
local n
local n2
-- 玩家跟怪物的戰鬥座標 plocx 玩家 nlocx 怪物
mimicat.plocx = 10
-- 繪出玩家及手上武器
draw_img(mimicat.imgs[4], mimicat.plocx ,mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
-- 繪出怪物 & 怪物表情
draw_img(fmob.imgs, fmob.locx, fmob.y)
draw_mob_hp_img()
-- 繪製戰鬥可行走之範圍
draw_fight_move_range()
repeat
-- 顯示目前字串
sub_show_msg(bbs.userid.."的行動",4,30)
if bbs.kbhit(1) then
char = bbs.getch()
if bbs.clock() - last_update > 0.1 then
if char == 'LEFT' then
mimicat.plocx = mimicat.plocx - 2
elseif char == 'RIGHT' then
mimicat.plocx = mimicat.plocx + 2
end
if mimicat.plocx < 0 then mimicat.plocx = 0 end
if mimicat.plocx > movex1 then mimicat.plocx = movex1 end
if mimicat.plocx < movex2 then mimicat.plocx = movex2 end
if mimicat.plocx + 10 >= fmob.locx then mimicat.plocx = mimicat.plocx - 2 end
n = fmob.locx - mimicat.plocx
if n < mimicat.act_range + 16 then
ar = (mimicat.act_range + magic.atk_range + 18 - n) / n * 100 + mimicat.dex * 0.3
if ar > 100 then ar = 100 end
else
ar = 0
end
bbs.color()
bbs.move(3,1);bbs.outs(string.format("命中率:%2.1f",ar),"% ")
-- bbs.move(6,1);bbs.print(nlocx," ",plocx," ")
-- 繪製mimicat 及手上武器
-- change image index
mimicat.img_i = mimicat.img_i + 1
if mimicat.img_i > 2 then
mimicat.img_i = 1
end
n = mimicat.imgs[4 + mimicat.img_i]
draw_img(n , mimicat.plocx ,mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
-- 按下A 普通攻擊 S 大絕招 D 防禦 Q 逃跑(必須跑到最後一格)
if char == 'ENTER' then
elseif char == 'a' or char == 'A' then
-- 戰鬥普攻計算副程式
sub_act(ar)
-- 輪到對方行動
sub_mob_act()
elseif char == 's' or char == 'S' then
-- 使用技能
sub_skills_select()
elseif char == 'd' or char == 'D' then
-- 戰鬥防禦計算副程式
sub_def()
-- 輪到對方行動
sub_mob_act()
elseif char == 'q' or char == 'Q' then
if mimicat.plocx <= 2 then
-- 逃跑副程式
sub_quit()
-- 如果戰鬥還沒結束,繪出行動範圍
if fmob.hp > 0 then
-- 輪到對方行動
sub_mob_act()
end
else
-- 顯示目前字串
sub_show_msg("好像要再退後一點才能逃跑",4,24)
end
elseif char == 'i' then
sub_test()
bbs.pause()
end
bbs.move(24,79)
last_update = bbs.clock()
end
end
bbs.move(24,79)
until (char == '^Q' or fmob.hp <= 0 or gamefin == 1)
bbs.pause()
bbs.color()
bbs.clear()
if gamefin ~= 1 then
draw_start()
draw_map()
-- 繪製地圖上的npc
draw_npc_in_map()
map_walk()
end
end -- end function fight
-- ========================================================================
-- 使用技術判斷(判斷使用的武器符不符合及選擇副程式動畫)
function sub_skills_select()
-- bbs.move(1,2)
-- bbs.outs(mimicat.wp_sk)
-- bbs.pause()
-- 補血技能 (武器不限)
if mimicat.wp_sk =='healing' then
if mimicat.mp >= mimicat.wp_sk_lv * 2 then
-- 回復術副程式 & 動畫
sub_sk_heal()
-- 輪到對方行動
sub_mob_act()
else
sub_show_msg("MP不足無法施展回復術",4,30)
end
elseif mimicat.wp_sk == 'summon train' then
-- 召喚宇宙電車(阪急號
if gold >= mimicat.wp_sk_lv * 100 then
-- 宇宙列車阪急號
sub_sk_summon_train()
-- 輪到對方行動
sub_mob_act()
else
sub_show_msg("沒錢付車票..",4,30)
end
elseif mimicat.wp_sk == 'final hit' then
-- 無限斬擊 限匕首
if mimicat.wp_type == 'dagger' then
-- 無限斬擊副程式 & 動畫
sub_final_hit()
-- 輪到對方行動
sub_mob_act()
else
sub_show_msg("你拿的不是匕首,無法施展",4,30)
end
elseif mimicat.wp_sk == 'magnum shot' then
-- 穿心箭 限弓箭
if mimicat.wp_type == 'bow' then
if mimicat.mp >= mimicat.wp_sk_lv * 5 then
-- 穿心箭副程式 & 動畫
sub_sk_magnum_shot()
-- 輪到對方行動
sub_mob_act()
else
sub_show_msg("MP不足無法施展穿心箭",4,30)
end
else
sub_show_msg("你拿的不是弓箭,無法施展",4,30)
end
else
end
bbs.color()
end -- end
-- ========================================================================
-- 使用回復術副程式 & 動畫
function sub_sk_heal()
local get_hp
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
bbs.color()
sub_show_msg("LV "..mimicat.wp_sk_lv.."回復術 (healing)",4,30)
mimicat.mp = mimicat.mp - mimicat.wp_sk_lv * 2
bbs.sleep(1.4)
get_hp = mimicat.wp_sk_lv * 5 + mimicat.int * 2 + 10
mimicat.hp = mimicat.hp + get_hp
-- hp 判斷程式
sub_check_hp()
-- 頭上跳出文字
draw_show_get("mp - "..mimicat.wp_sk_lv * 2,31)
draw_show_get("hp + "..get_hp,32)
bbs.color()
draw_start()
end -- function sub_sk_heal
-- ========================================================================
-- 使用無限斬擊 & 動畫
function sub_final_hit()
local n
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
bbs.color()
sub_show_msg("LV "..mimicat.wp_sk_lv.."無限斬擊 (final hit)",4,30)
-- 主角身體發光,然後隱藏在黑暗
-- 之後瞬移到敵人面前連擊
-- 將主角彩色隱身
draw_hide_mimicat(1)
bbs.color()
n = fmob.locx - 12
draw_img(mimicat.imgs[4], n , mimicat.plocy)
draw_mimicat_wp(n)
c_hit = 0
while (c_hit ~= 1) do
bbs.sleep(0.3)
c_hit = math.random(3 + mimicat.wp_sk_lv)
hit_atk = math.random(mimicat.dex * 2 + mimicat.wp_atk) + mimicat.dex - fmob.def
if hit_atk <=0 then hit_atk = 1 end
fmob.hp = fmob.hp - hit_atk
-- 怪物失血表情
draw_mob_hp_img()
-- mimicat 匕首發光攻擊
bbs.color(1,30,40);draw_mimicat_wp(n)
bbs.sleep(0.3)
bbs.color(1,37);draw_mimicat_wp(n)
-- 怪物身上閃紅光
bbs.color(31)
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.sleep(0.3)
bbs.color()
draw_img(fmob.imgs, fmob.locx, fmob.y)
temp = bbs.userid.."的攻擊,"..fmob.name.."受到了"..hit_atk.."點傷害"
sub_show_msg(temp,4,24)
bbs.color();draw_mimicat_wp(n)
if fmob.hp <=0 then
bbs.color(0,30,40)
draw_img(mimicat.imgs[4], n , mimicat.plocy)
draw_mimicat_wp(n)
bbs.color()
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
-- 怪物死掉 & 計算副程式
sub_mob_die()
c_hit = 1
end
end
if fmob.hp > 0 then
bbs.color()
bbs.move(mimicat.plocy,n)
bbs.rect(4,12)
bbs.color()
-- 將主角彩色現身
draw_hide_mimicat(2)
end
end -- end function final hit
-- ========================================================================
-- 召喚阪急號
function sub_sk_summon_train()
local i
local d_atk
local temp
local t_img = {
[1] = { '*[1m ______════_▕▔▔▔▔▏______< ≡≡≡≡<______*[m',
'*[m *[0;30;47m◤*[1;33mo*[37m╭──╮▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔╭──╮*[36mo*[0;30;47m◥*[m',
'*[m *[30;47m◤ *[1m█*[37m│*[30m██*[37m│________________║________________│*[30m██*[37m│*[30m█ *[0;30;47m◥*[m',
'*[1;34m ▕*[37;44m ㊣ │*[30m██*[37m│*[0;34;40m████████*[1;44m║*[0;34;40m████████*[1;37;44m│ │ ㊣ *[34;40m▏*[m',
'*[1;34m ▕*[37;44m E404│*[30m██*[37m│ *[34m ║ *[37m │ │E404
▏*[m',
'*[1;34m ▕*[44m■══▃▃▃══════════════════▃▃▃══■*[40m▍*[m',
'*[1;34m◢◤*[36m▔*[37m◎=◎=◎▔▔ \==========// ≡≡≡≡▔▔▔▔*[37m◎=◎=◎*[36m▔\*[1;34m◣*[m',
},
[2] = { '*[1m ≡≡≡≡<______*[m',
'*[1;37;47m▔▔▔▔▔▔▔╭──╮*[36mo*[0;30;47m◥*[m',
'*[1;37;47m _____________│*[30m██*[37m│*[30m█ *[0;30;47m◥*[m',
'*[0;34;40m███████*[1;37;44m│ │ ㊣ *[1;34;40m▏*[m',
'*[1;37;44m │ │E404 ▏*[m',
'*[1;34;44m═══════▃▃▃══■*[40m▍*[m',
'*[1;36m≡≡≡▔▔▔▔*[37m◎=◎=◎*[36m▔\*[1;34m◣*[m',
},
[3] = { '*[1m ______════_▕▔▔▔▔▏',
'*[m *[0;30;47m◤*[1;33mo*[37m╭──╮▔▔▔▔▔▔▔▔▔*[m',
'*[m *[30;47m◤ *[1m█│*[30m██*[37m│________________║*[m',
'*[1;34m ▕*[37;44m ㊣ │*[30m██*[37m│*[0;34;40m█████████*[m',
'*[1;34m ▕*[37;44m E404│*[30m██*[37m│ *[34m ║*[m',
'*[1;34m ▕*[44m■══▃▃▃═════════ *[m',
'*[1;34m◢◤*[36m▔*[37m◎=◎=◎
▔▔ \==========// ≡*[m',
},
[4] = { '*[1m ______═',
'*[m *[0;30;47m◤*[1;33mo*[37m╭──╮*[m',
'*[m *[30;47m◤ *[1m█│*[30m██*[37m│*[m',
'*[1;34m ▕*[37;44m ㊣ │*[30m██*[37m│*[m',
'*[1;34m ▕*[37;44m E404│*[30m██*[37m│*[m',
'*[1;34m ▕*[44m■══▃▃▃ *[m',
'*[1;34m◢◤*[36m▔*[37m◎=◎=◎
▔*[m',
},
}
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
bbs.color()
sub_show_msg("LV "..mimicat.wp_sk_lv.." 阪急號 宇宙の電車 ",4,26)
n = mimicat.wp_sk_lv * 100
draw_show_get("-"..n.." gold",31)
gold = gold - mimicat.wp_sk_lv * 100
draw_start()
-- 將主角彩色隱身
draw_hide_mimicat(1)
sub_show_msg("噹噹噹噹..........",4,30)
-- 阪急號現身 以1/20的機會碾過兩次
-- d_atk是雙重碾過的旗標
d_atk = math.random(20)
if bbs.userid == 'guest' then d_atk = math.random(2) end
if d_atk == 1 then n1 = 2 else n1 = 1 end
hit_atk = 0
n = 0
for i = 1 , n1 do
bbs.sleep(2.5)
draw_img(t_img[2], 0 , 7)
bbs.sleep(0.1)
bbs.move(7,0);bbs.rect(7,30)
draw_img(t_img[1], 0 , 7)
bbs.sleep(0.1)
bbs.move(7,0);bbs.rect(7,16)
draw_img(t_img[1], 16 , 7)
bbs.sleep(0.1)
bbs.move(7,0);bbs.rect(7,16)
bbs.move(7,0);bbs.rect(7,54)
draw_img(t_img[3], 45 , 7)
bbs.sleep(0.1)
bbs.move(7,0);bbs.rect(7,62)
draw_img(t_img[4], 62 , 7)
bbs.sleep(0.1)
bbs.color()
bbs.move(7,0);bbs.rect(7,80)
n = n + math.random(100) + mimicat.wp_sk_lv * 150
hit_atk = hit_atk + n
fmob.hp = fmob.hp - n
-- 怪物現身 (被擊退到最後面)
fmob.locx = 62
bbs.color()
draw_img(fmob.imgs, fmob.locx, fmob.y)
-- 怪物失血表情
draw_mob_hp_img()
end
-- 阪急號駛過
-- 怪物失血表情
draw_mob_hp_img()
-- 主角現身
draw_hide_mimicat(2)
bbs.sleep(1)
draw_img(fmob.imgs, fmob.locx, fmob.y)
if d_atk == 1 then
temp = "被阪急號跟新東日號碾過,"..fmob.name.."受到了"..hit_atk.."點傷害"
else
temp = "被阪急號碾過,"..fmob.name.."受到了"..hit_atk.."點傷害"
end
sub_show_msg(temp,4,20)
bbs.sleep(1.4)
if fmob.hp <=0 then
-- 怪物死掉 & 計算副程式
sub_mob_die()
end
end -- end function summon train
-- ========================================================================
-- 特技 穿心箭
function sub_sk_magnum_shot()
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
bbs.color()
sub_show_msg("LV "..mimicat.wp_sk_lv.." 穿心箭 (magnum shot) ",4,26)
n = mimicat.wp_sk_lv * 5
draw_show_get("-"..n.." mp",31)
mimicat.mp = mimicat.mp - mimicat.wp_sk_lv * 5
draw_start()
bbs.color(1,36)
for i = 1 , 100 do
bbs.move(mimicat.plocy - 1,mimicat.plocx + 4)
bbs.outs(i,"% ")
bbs.sleep(0.01)
bbs.move(23,79)
end
bbs.color();draw_mimicat_wp(mimicat.plocx)
hit_atk = math.random(mimicat.dex * 2 + mimicat.wp_atk) + mimicat.dex
hit_atk = hit_atk * 2 + mimicat.wp_sk_lv * 25
fmob.hp = fmob.hp - hit_atk
-- 穿心箭動畫副程式
sub_show_light_bolt(3)
bbs.move(mimicat.plocy - 1,mimicat.plocx + 4)
bbs.outs(" ")
-- 怪物被擊退
fmov = fmob.locx
if fmob.locx < 62 then fmov = fmob.locx + math.random(62 - fmob.locx) end
for i = fmob.locx , fmov do
fmob.locx = i
bbs.color()
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.sleep(0.1)
end
-- 怪物失血表情
draw_mob_hp_img()
bbs.color()
draw_img(fmob.imgs, fmob.locx, fmob.y)
temp = bbs.userid.."的攻擊,"..fmob.name.."受到了"..hit_atk.."點傷害"
sub_show_msg(temp,4,24)
bbs.sleep(1.5)
if fmob.hp <=0 then
-- 怪物死掉 & 計算副程式
sub_mob_die()
end
end -- end function
-- ========================================================================
-- 特技 旋風斧,往前打3 + wp_sk 格
function sub_sk_whirlwind()
end -- end function
-- ========================================================================
-- 圓桌武士相救
function sub_act_a()
end
-- ========================================================================
-- 普通攻擊計算副程式 & 動畫處理 (傳入值,命中率)
function sub_act(ar)
local n
local n1
local n2
-- 繪出mimicat站立姿
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
-- 顯示目前字串
sub_show_msg("普通攻擊",4,30)
bbs.sleep(1)
if ar == 0 then
-- 顯示目前字串
sub_show_msg("太遠了,打不到",4,30)
bbs.sleep(1)
else
-- 近武類 劍 斧 鎚
if mimicat.wp_type == 'sword' then
hit_atk = math.random(mimicat.str + mimicat.wp_atk) + mimicat.str * 2
elseif mimicat.wp_type == 'axe' then
hit_atk = math.random(mimicat.str + mimicat.wp_atk * 3) + mimicat.str
elseif mimicat.wp_type == 'hammer' then
-- 槌類武器
elseif mimicat.wp_type == 'bow' then
-- 弓箭類武器
hit_atk = math.random(mimicat.dex * 2 + mimicat.wp_atk) + mimicat.dex
-- 光箭動畫副程式
-- draw_atk_show_light_bolt(2)
sub_show_light_bolt(2)
elseif mimicat.wp_type == 'dagger' then
-- 匕首類武器
hit_atk = math.random(mimicat.dex * 2 + mimicat.wp_atk) + mimicat.dex
-- mimicat 匕首發光攻擊
bbs.color(1,30,40);draw_mimicat_wp(mimicat.plocx)
bbs.sleep(0.2)
bbs.color(1,37);draw_mimicat_wp(mimicat.plocx)
bbs.sleep(0.2)
bbs.color();draw_mimicat_wp(mimicat.plocx)
elseif mimicat.wp_type == 'staff' then
-- 法杖類武器
if mimicat.mp >= 10 then
mimicat.mp = mimicat.mp - 10
-- 光箭動畫副程式
-- draw_atk_show_light_bolt(1)
sub_show_light_bolt(1)
hit_atk = mimicat.int * 3 + 10 + mimicat.wp_atk
else
-- 顯示目前字串
sub_show_msg("MP不足無法施展",4,30)
bbs.sleep(1)
end
end
-- 怪物防禦減傷
hit_atk = hit_atk - fmob.def
if hit_atk <= 0 then hit_atk = 0 end
-- 判斷有沒有命中
n2 = math.random(ar)
if n2 < 100 - ar then hit_atk = 0 end
-- 判斷有沒有暴擊
cri = math.random(11 - mimicat.luk)
if cri <= 1 then
get_cri = 1
hit_atk = hit_atk + mimicat.wp_atk * 2 + 5
else
-- 匕首擁有33%暴擊率
if mimicat.wp_type == 'dagger' then
cri = math.random(3)
if cri == 1 then get_cri =1 end
end
get_cri = 0
end
-- 擊中怪物,怪物閃紅光
if hit_atk > 1 then
-- 擊中怪物,怪物閃紅光
if get_cri == 1 then bbs.color(1,31) else bbs.color(31) end
-- 繪出怪物立姿
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.sleep(0.3)
bbs.color()
draw_img(fmob.imgs, fmob.locx, fmob.y)
-- 顯示目前字串
temp = bbs.userid.."的攻擊,"..fmob.name.."受到了"..hit_atk.."點傷害"
sub_show_msg(temp,4,24)
bbs.sleep(1)
-- 扣血
fmob.hp = fmob.hp - hit_atk - magic.dmg
draw_mob_hp_img()
-- 吸血吸魔
mimicat.hp = mimicat.hp + math.floor((hit_atk + magic.dmg) * (magic.ah / 100))
mimicat.mp = mimicat.mp + math.floor((hit_atk + magic.dmg) * (magic.am / 100))
-- hp 判斷程式
sub_check_hp()
-- 繪出狀態
draw_start()
-- 如果怪物死亡
if fmob.hp <=0 then
-- 怪物死掉 & 計算副程式
sub_mob_die()
end
else
-- 沒擊中怪物,頭上冒出miss
for i = 1 , 3 do
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.color(1,31);bbs.move(7 - i,fmob.locx + 4);bbs.outs("miss")
bbs.sleep(0.3)
bbs.color();bbs.move(7 - i,fmob.locx + 4);bbs.outs(" ")
end
draw_img(fmob.imgs, fmob.locx, fmob.y)
-- 顯示目前字串
sub_show_msg(bbs.userid.."的攻擊,被"..fmob.name.."閃了過去",4,24)
bbs.sleep(1)
end
end
end -- end function
-- ========================================================================
-- 防禦計算副程式 & 動畫處理
function sub_def()
-- 繪出mimicat站立姿
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
-- 顯示目前字串
sub_show_msg("技能 (Defence) 回復少量HP&MP",4,24)
bbs.sleep(1)
-- 頭上跳出文字
draw_show_get("hp + "..mimicat.con * 2,32)
draw_show_get("mp + "..mimicat.int * 2,36)
mimicat.hp = mimicat.hp + mimicat.con * 2
mimicat.mp = mimicat.mp + mimicat.int * 2
-- 使用防禦技能旗標
use_def = 2
if mimicat.hp > mimicat.hpmax then
mimicat.hp = mimicat.hpmax
end
if mimicat.mp > mimicat.mpmax then mimicat.mp = mimicat.mpmax end
draw_start()
end -- end function sub_def
-- ========================================================================
-- 怪物死掉計算副程式 & 動畫處理
function sub_mob_die()
local get_exp
local img = {[1]={' ╲│╱ ',
' ─O─ ',
' /│╲ ',
},
[2]={' ︱ ',
' -‧-',
' ︱ ',
},
[3]={' ╲ ╱ ',
' ‧ ',
' / ╲ ',
},
[4]={' ‧ ‧',
' + ',
' ‧ ‧',
},
}
fmob.hp = 0
-- 清除怪物 & mimicat
bbs.move(fmob.y,fmob.locx)
bbs.rect(8,80 - fmob.locx)
-- 繪製怪物表情
draw_mob_hp_img()
for i = 1 , 4 do
if i == 1 then bbs.color(1,33,40) end
if i == 2 then bbs.color(1,37,40) end
if i == 3 then bbs.color(0,33,40) end
if i == 4 then bbs.color(1,30,40) end
draw_img(img[i], fmob.locx + 4, fmob.y + 4)
-- draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.sleep(0.3)
end
bbs.color()
bbs.move(fmob.y,fmob.locx)
bbs.rect(8,80 - fmob.locx)
bbs.move(23,79)
bbs.sleep(1.4)
-- 清除mimicat戰鬥姿
bbs.color(0,30,40)
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
bbs.color()
-- 清除將mimicat回復站立姿
draw_img(mimicat.imgs[3], mimicat.plocx + 2 , mimicat.plocy)
-- 顯示目前字串
get_exp = fmob.exp + math.floor(magic.addexp * fmob.exp / 100)
sub_show_msg("戰鬥勝利,獲得"..get_exp.."點經驗值",4,28)
-- 頭上跳出文字
draw_show_get("exp +"..get_exp,36)
-- 打倒怪物獲得金幣
n = math.random(4)
if n == 1 then
n = math.random(fmob.exp) * mimicat.luk
gold = gold + n
sub_show_msg("戰鬥勝利,獲得"..n.."金幣",4,28)
-- 頭上跳出文字
draw_show_get("Gold +"..n,33)
bbs.sleep(1)
end
bbs.sleep(1)
mimicat.exp = mimicat.exp + get_exp
-- 升級
while (mimicat.exp >= mimicat.lv^2*100) do
mimicat.exp = mimicat.exp - mimicat.lv^2*100
mimicat.lv = mimicat.lv + 1
mimicat.hpmax = (mimicat.con + magic.con )* 30 + mimicat.lv * 10 + 10
mimicat.mpmax = (mimicat.int + magic.int )* 15 + mimicat.lv * 10 + 20
mimicat.hp = mimicat.hpmax
mimicat.mp = mimicat.mpmax
mimicat.ap = mimicat.ap + 1
-- 顯示目前字串
sub_show_msg("等級上升為 "..mimicat.lv,4,28)
-- 頭上跳出文字
draw_show_get("Level UP!",33)
bbs.sleep(2)
-- 顯示狀態欄
draw_start()
end
end -- end function sub_mob_die
-- ========================================================================
-- 戰鬥逃跑計算副程式 & 動畫處理
function sub_quit()
-- 清除mimicat站立姿
bbs.color(0,37,40)
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
-- 顯示目前字串
sub_show_msg("逃跑中準備",4,30)
for i = 1 , 10 do
draw_img(mimicat.imgs[6 + mimicat.img_i], mimicat.plocx , mimicat.plocy)
draw_img(mimicat.imgs[6 + mimicat.img_i], mimicat.plocx , mimicat.plocy)
-- change image index
mimicat.img_i = mimicat.img_i + 1
if mimicat.img_i > 2 then
mimicat.img_i = 1
end
bbs.sleep(0.3)
end
get_quit = math.random(10)
if get_quit >= 6 then
bbs.color(0,37,40)
draw_img(mimicat.imgs[6 + mimicat.img_i], mimicat.plocx , mimicat.plocy)
bbs.color()
n = mimicat.plocy - 1
bbs.move(n + 0,0);bbs.outs(" ╭╮ ")
bbs.move(n + 1,0);bbs.outs(" ───╯ ")
bbs.move(n + 2,0);bbs.outs(" ─── ")
bbs.move(n + 3,0);bbs.outs(" ───╮ ")
bbs.move(n + 4,0);bbs.outs(" ╰╯ ")
fmob.hp = 0
-- 顯示目前字串
sub_show_msg("bye bye (▔▽▔)\\~/",4,30)
-- 怪物表情變更生氣
bbs.color(1,31);bbs.move(3,67)
bbs.outs(" !!(‵□′#)")
bbs.color()
else
-- 顯示目前字串
sub_show_msg("逃跑失敗(⊙⊙)",4,30)
end
bbs.sleep(1)
end -- end function sub_mob_act
-- ========================================================================
-- 戰鬥怪物攻擊計算副程式 & 動畫處理
function sub_mob_act()
local i
if fmob.hp <= 0 then return -1 end
-- 顯示目前字串
sub_show_msg(fmob.name.."的行動",4,30)
-- 顯示怪物可移動範圍
draw_mob_move_range()
-- bbs.outs(fmob.locx - mimicat.plocx + 10)
bbs.sleep(1.5)
-- 如果距離大於攻擊範圍,移動前進
if fmob.locx - mimicat.plocx + 10 > fmob.atk_range * 2 + 20 then
-- 顯示目前字串
sub_show_msg(fmob.name.."的移動..",4,30)
for i= 1 , fmob.mov_range do
bbs.color(0,30,40)
draw_img(fmob.imgs, fmob.locx, fmob.y)
fmob.locx = fmob.locx - 2
if mimicat.plocx + 10 >= fmob.locx then fmob.locx = fmob.locx + 2 end
bbs.color()
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.sleep(0.3)
end
bbs.color()
-- draw_img(fmob.imgs, fmob.locx, fmob.y)
-- 如果移動到範圍內,進行普通攻擊
if fmob.locx - mimicat.plocx + 10 <= fmob.atk_range * 2 + 20 then
-- 顯示目前字串
sub_show_msg(fmob.name.."的攻擊..",4,30)
bbs.sleep(1)
-- 普通攻擊
fun_mob_atk()
end
else
-- 普通攻擊
fun_mob_atk()
end
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
-- 如果戰鬥還沒結束,繪出行動範圍
if fmob.hp > 0 then draw_fight_move_range() end
end -- end function sub_mob_act
-- ========================================================================
-- npc 怪物攻擊副程式
function fun_mob_atk()
local msg
hit_atk = math.random(fmob.atk) + fmob.atk
hit_atk = hit_atk - math.random(mimicat.def * 4)
if hit_atk <= 1 then hit_atk = 1 end
-- 假如有使用防禦技能
if mimicat.use_def > 0 then
hit_atk = hit_atk - (mimicat.def * 3) - math.random(50)
mimicat.use_def = mimicat.use_def - 1
if mimicat.use_def < 0 then mimicat.use_def = 0 end
if hit_atk <= 1 then hit_atk = 1 end
msg = fmob.name.."的攻擊,被你格擋下來,你受到"..hit_atk.."點傷害"
else
msg = fmob.name.."的攻擊,對你造成了"..hit_atk.."點傷害"
end
cri = math.random(10)
if cri == 1 then hit_atk = hit_atk * 2 end
-- 顯示目前字串
sub_show_msg(msg,4,24)
-- 繪出mimicat站立姿 被擊中閃紅光
if cri == 1 then bbs.color(1,31) else bbs.color(31) end
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
bbs.sleep(0.4)
bbs.color()
draw_img(mimicat.imgs[4], mimicat.plocx , mimicat.plocy)
draw_mimicat_wp(mimicat.plocx)
mimicat.hp = mimicat.hp - hit_atk
if mimicat.hp <=0 then mimicat.hp = 0
-- 畫出狀態欄
draw_start()
-- 繪出game over
draw_img(game_imgs[1], 15 , 9)
gamefin = 1
bbs.pause()
end
-- 畫出狀態欄
draw_start()
end -- end fun_mob_atk
-- ========================================================================
-- 測試用function
function sub_test()
local i
local tc
local temp = ""
local temp2 = ""
local local_img = {
[0] = {
' ',
' ▋ ╱▏ _◣▁ ▂▄▂ ▁╱ | ︳MASKED RIDER',
'
▉ ∕▏ ▂▄▌ —─ │ ',
'
▊ ▋/▏▏ ▊▋  ̄|│ ︱ ▅▅▆ ▅▆ ▅▅ ▅▆ ▅▅ ▆',
'
▋◥◣◣◥◣▍▎ ▉▏ ︳∕ ︳ ◢◤▄ ◢_▋ ▌ ◢_▋◢◤ ◢◤◢',
'
▕◣█▆▂ ◥▉
▊▎ ︱╱ ▕ ◢ ▅◤◢◤ ▋ ▊ ◢◤ ▋█▅ ◢◤ ◣',
'
◥/
◥ ▋ ▄ ▏ ● / ▄▊ ︳▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃',
'
▋ ◣/
▊ █ ◥◣▊▎ ◢ ▌▕ ',
'
◥▎▏ ▏▏ ◣◣
◢ ▎︳ RIDER FORM',
'
◥▋▏ ▎▎ ▌▌ ▋∕ ',
'
▋ ◥▎ ◤ █▅ .∕',
'
◢﹨ ◣◣ █▃ ◤︳ ',
'
▉ ●◢\\
◥▂▅ ─ ▅▂◤ \ 「人と人との信賴を利用するワーム、',
'
ˍ◣ ◤▄▇▎──▍
╴ / ',
'
◢◤ ̄ ◥◣▋──▎ ∕ ﹨ おれは絕對に許\さない!!」',
'
◥◣ ◥◣ ▁▏ ∕ ︳ ',
'
▏◥▇▅▃▂ ◥▆█▎ ∕ ',
'
▄▄▃▏▎ ◢ █▏▄
▂ ▋ ▅▃▁',
'
███◤ ▎▏█▏ ◥◣ ▋ ▅',
'
▏ ̄◥▇▆▄▂◥▏▃▁◥ ▊ ˍ▂ ╲',
'
▎ ▇▆▆▇ ▁▇▇◣ ﹨',
'
▌◣ ◥█▎ ◥ ▂▄ ﹨ ZEPHYR',
'
▊◥▎ ◤ ◢◤ ̄◤ ▁▃  ̄ ̄ ̄ ̄ ̄ ̄ ̄',
' ',
},
[1] = {' ',
'
',
'
▉ ▏ ',
'
▊ ▎ ',
'
▉ ▏ ',
'
',
' ',
},
[2] = {' ',' ',
'
▉ ▏ ',
'
▊ ▎ ',
'
◣◣█◢◢ ',
},
[3] = { ' *[1;34m↑︹↑*[m ',
' *[1;34m(*[1;32;44m●*[1;37;44mΞ*[1;32m●*[0;1;34m)*[m ',
' /*[1;33m▽*[1;36;44m==*[0;1;33m▽*[m\\ ',
' *[1;34m◤ ◥*[m ',
},
}
-- 清除地板的藍線
bbs.color(47);bbs.move(14,0);bbs.print(cline)
sub_show_msg("假面騎士GATACK RIDER FORM",4,24)
-- 怪物表情變更驚嚇
bbs.color(1,33);bbs.move(3,67)
bbs.outs(" !!(⊙□⊙;)")
bbs.color()
-- 怪物,頭上冒出!!!!
for i = 1 , 3 do
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.color(1,37);bbs.move(7 - i,fmob.locx + 4);bbs.outs("!!!!")
bbs.sleep(0.3)
bbs.color();bbs.move(7 - i,fmob.locx + 4);bbs.outs(" ")
end
draw_img(fmob.imgs, fmob.locx, fmob.y)
sub_show_msg("假面騎士GATACK RIDER FORM",4,24)
-- 怪物被嚇退
fmov = fmob.locx
if fmob.locx < 40 then fmov = fmob.locx + 40 - fmob.locx end
for i = fmob.locx , fmov do
fmob.locx = i
bbs.color()
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.sleep(0.1)
end
-- 主角隱身
draw_hide_mimicat(1)
for i = 15 , 1 , -1 do
draw_img_d(local_img[0], 0, i - 3 ,4,13)
bbs.sleep(0.1)
end
-- 強調作者id
bbs.sleep(2)
bbs.color(32,47);bbs.move(13,52)
bbs.outs(" ascii by 巴哈 SRXPOWERED ")
bbs.sleep(1.5)
-- 清除戰鬥畫面
bbs.color();bbs.move(4,0);bbs.rect(10,80)
-- 繪出怪物立姿
draw_img(fmob.imgs, fmob.locx, fmob.y)
-- draw_img(game_imgs[3], 0, 0)
-- 繪出從天而降的光影
for i = 1 , 13 do
draw_img_d(local_img[1], 11, i - 3 ,4,13)
bbs.sleep(0.05)
end
draw_img(local_img[2], 11, 9)
bbs.sleep(0.1)
draw_img(local_img[3], 11, 10)
bbs.sleep(1)
bbs.move(12,11)
bbs.outs(ConvertANSI(" <*[1;33m▽*[1;36;44m==*[0;1;33m▽*[m▔ "))
bbs.move(23,79)
bbs.sleep(1)
-- 手掌發光
math.randomseed(bbs.clock())
for i = 1 , 30 do
tc = math.random(7) + 30
bbs.color(0,1,tc)
bbs.move(12,20);bbs.outs("▔")
bbs.move(23,79)
bbs.sleep(0.05)
end
bbs.color()
bbs.move(12,20);bbs.outs("▔");bbs.move(23,79)
-- 發射雷射光
for i = 1 , 29 do
temp = temp .."▔"
temp2 = temp2 .." "
end
bbs.color(1,33)
bbs.move(12,22);bbs.outs(temp);bbs.move(23,79)
-- 怪物被擊中 閃紅光
bbs.color(31);draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.color()
bbs.sleep(0.5)
bbs.color()
bbs.move(12,22);bbs.outs(temp2);bbs.move(23,79)
-- 繪出怪物立姿
draw_img(fmob.imgs, fmob.locx, fmob.y)
bbs.sleep(1)
temp = "假面超人的攻擊,"..fmob.name.."受到了"..fmob.hp.."點傷害"
sub_show_msg(temp,4,24)
-- 繪出從天而降的光影
for i = 13 , 1 , -1 do
draw_img_d(local_img[1], 11, i - 3 ,4,13)
bbs.sleep(0.05)
end
-- 主角現身
draw_hide_mimicat(2)
fmob.hp = 0
-- 怪物死亡計算副程式
sub_mob_die()
end -- end test function
-- ========================================================================
-- npc 說話副程式
function fun_npc_talk(npc_index)
bbs.move(0,0)
-- bbs.color(46)
bbs.rect(6,80)
bbs.color()
drawBoundary(0, 18, 0, 7);
drawBoundary(18, 80, 0, 7);
draw_img(npc.npc[npc_index].img[1], 5, 1)
bbs.move(5,5)
bbs.outs(npc.npc[npc_index].name)
-- 將對話顯示在對話匡
for i = 1 , npc.npc[npc_index].talkcount do
bbs.move(1,20)
bbs.rect(5,58)
draw_img(npc.npc[npc_index].talk[i], 20, 1)
bbs.pause()
end
if npc.npc[npc_index].type == 'mob' then
-- 進入戰鬥模式
fmob.index = npc.npc[npc_index].mob
draw_fight()
fun_fight()
end
bbs.color()
bbs.clear()
bbs.kbreset()
draw_start()
draw_map()
-- 繪製地圖上的npc
draw_npc_in_map()
map_walk()
end -- end function npc talk
-- ========================================================================
-- last update time
last_update = bbs.clock()
-- 移動速度
move_speed = 0.2
-- 戰鬥方針 1 手動戰鬥 2 戰鬥至上 3 安全第一 4 逃跑
fight_mode = 1
-- 金錢
gold = 5000
-- 判斷hp/mp最大值
sub_check_hp()
mimicat.hp = mimicat.hpmax
mimicat.mp = mimicat.mpmax
-- =========================================================================
-- 以下為主程式
-- 遊戲標題畫面
-- sub_start_select()
-- gamefin = 1 遊戲結束旗標
if gamefin ~= 1 then
bbs.clear()
draw_start()
draw_map()
-- 繪製地圖上的npc
draw_npc_in_map()
end
n = math.random(3)
if n == 1 then
mimicat.wp_type = "dagger"
mimicat.wp_atk = 30
mimicat.wp_sk = "final hit"
mimicat.wp_sk_lv = 5
mimicat.move_range = 10
mimicat.act_range = 5
elseif n == 2 then
mimicat.wp_type = "staff"
mimicat.wp_atk = 50
mimicat.wp_sk = "summon train"
mimicat.wp_sk_lv = 5
mimicat.move_range = 4
mimicat.act_range = 45
elseif n == 3 then
mimicat.wp_type = "bow"
mimicat.wp_atk = 50
mimicat.wp_sk = "magnum shot"
mimicat.wp_sk_lv = 5
mimicat.move_range = 4
mimicat.act_range = 45
end
repeat
map_walk()
until (gamefin == 1)
bbs.color()
--#BBSLUA
※ 發信站: 批踢踢兔(ptt2.cc)
◆ From: 122.122.2.41
→ ForSinSoKing:超棒的啊!!!!!!!!!!推 10/17 05:51
→ Bachi:大推xD推 10/17 08:30
※ mike1026915:轉錄至看板 mike1026915 10/17 10:57
※ mike1026915:轉錄至看板 mike1026915 10/17 10:58
→ cockroach00:酷斃了!期待完成的那天!!推 10/17 11:27
→ fli79:大推!期待完成!推 10/17 11:53
→ k860326:道具鈕無用推 10/17 14:51
→ k860326:是還沒設計完成嗎?推 10/17 14:51
是的,道具技能及自動戰鬥尚未實裝
目前主要進度在補上戰鬥畫面的處理
→ penguin7272:推一個推 10/17 15:04
※ chhsiao:轉錄至看板 RhythmOfLife 10/17 15:34
→ Kinra:座標的X軸從兩位數變一位數的時候Y軸會少覆蓋一位掉XD推 10/17 17:10
感謝,已修正
→ sfwejfish:除了上面剛剛好像還發現一個 不過升到LV2出來就忘了推 10/17 23:08
→ tanshun:自動戰鬥沒有自動戰鬥 @ @推 10/18 00:41
→ realkillman:做得好! 註解很多 而且有用我的code XD推 10/18 08:59
→ k860326:好棒!!推 10/18 11:18
→ k860326:跑為上策有兩個 第二個下來變成自動戰鬥推 10/18 11:19
→ k860326:再也沒有手動了~~推 10/18 11:19
感謝,以修正
→ k860326:防禦hp並不會實加??推 10/18 17:25
→ k860326:怪物表情系統是不是還沒實裝呀@@?推 10/18 17:27
感謝以修正,以上兩個都實裝了,只是忘記補上顯示出來的副程式
→ k860326:建議無限斬擊可改成每打一下就扣X魔力推 10/18 17:48
→ k860326:武器是隨機的嗎 @@?推 10/18 17:50
目前是會隨機拿杖或是匕首,拿杖的特殊技是阪急號,拿匕首的特殊技是無限斬擊
之後會先為每一種武器做一種特殊技,至於平衡度會再做調整
無限斬目前的考慮是不扣任何能力,因為有可能砍一下也有可能一直把怪砍到死
→ chhsiao:特快車如果攻擊史萊姆達8xx時, 右上的臉不會變成瀕死推 10/18 19:54
感謝,以修正
→ Kinra:還是要說一下 這是目前為止介面等等的最完整的作品! GJ!!推 10/18 21:27
→ k860326:史萊姆出現了!!推 10/19 12:48
→ ilohoo:弓箭也出現了,為什麼按d會有火星人推 10/20 17:24
※ VElysian:轉錄至某隱形看板 10/20 18:36
→ k860326:加油~期待有劇情的一天(?)推 10/21 16:22
→ sfwejfish:超過10秒 變宅XDDDDDDD推 10/21 18:35
→ protendy:mp不足會出失敗...但還是會攻擊成功....推 10/22 01:41
※ acersh:轉錄至某隱形看板 10/22 14:40
→ mTwTm:推!!!!!!!!!!!!!! 話說又是踢牙老奶奶 XDD推 10/22 15:02
→ XZXie:真是太強大了 XDDDD推 10/23 11:58
→ k860326:可以先設計看看補魔補血的藥水嗎@@?推 10/23 18:04
→ k860326:看了一下程式碼.....只有貴到爆道具店推 10/23 19:26
→ k860326:所以7-11也會變成貴到爆道具店 Orz推 10/23 19:26
→ yoway945:蠻好玩的!!推 10/25 01:38
※ EmiruKitty:轉錄至看板 KittySpot 10/26 17:25
→ EmiruKitty:把CODE改一下把千本針叫出來打了XD推 10/26 17:33
→ EmiruKitty:主角一次不能升兩級以上and攻擊力無法升級XD推 10/26 18:15
→ rock77606:好酷!!推 10/27 01:47
※ rock77606:轉錄至某隱形看板 10/27 01:48
→ zack7301428:借轉推 10/30 00:40
※ zack7301428:轉錄至某隱形看板 10/30 00:41
※ zack7301428:轉錄至某隱形看板 10/30 00:43
※ unumbra:轉錄至某隱形看板 10/31 22:40
→ hevark:好酷推 11/01 12:22
→ newyellow:有威,推一個推 11/04 15:04
→ teee:強推 11/04 19:45
→ k860326:彩色!!推 11/05 17:47
→ k860326:無限斬擊不會扣魔推 11/07 18:35
→ k860326:喔..抱歉 突然忘記上面有問到推 11/07 18:36
→ k860326:史萊姆王不理我 Orz推 11/07 18:38
→ Kinten:假面騎士......推 11/09 23:32
→ StubbornLin:喔喔! 太強了 XD 我打嘴砲那麼久說想做推 11/13 15:54
→ StubbornLin:結果還是沒做 XD 真強者做出來了 酷斃了 XDD推 11/13 15:54
→ StubbornLin:話說旅館的小姐為啥不能叫 囧推 11/13 15:54
→ StubbornLin:我要小姐阿 Q_Q推 11/13 15:55
果然大家還是期望的是這個.....
引用了Frozenmouse大大的選單 <(m__m)>
先做了旅館的功能
→ Bachi:雖然猜到還是笑翻了xDDD推 11/18 18:57
→ k860326:小姐好XXX....推 11/19 13:52
→ mTwTm:推 XD"推 11/19 14:00
→ mTwTm:看程式碼才發現隨機 我第一次是遇到ㄋㄐ囧 之後再也沒遇到推 11/19 15:49
→ DInYa:好棒>////<...小姐那邊的字有些會出現亂碼喔+w+推 11/29 16:54
→ k860326:小姐不會補血= =推 12/06 19:39
→ Frozenmouse:上面是控制碼嗎XDDDDD推 12/10 18:30
→ Frozenmouse:推小姐跟瀕死狀態XD推 12/10 18:34
→ k860326:還有為什麼叫我們按alt+F4啊= =推 12/12 14:08