123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- local function base_overview(pos)
- local meta = core.get_meta(pos)
- local health = meta:get_int('health')
- local scale = (health/500) * 3
- local formspec =
- kobo.building_inv..
- 'textarea[3.25,0;7.5,1;;;Town Center]'..
- 'image[0,0;3,3;kobo_base_snap.png]'..
- 'image_button[3.25,2;1,1;kobo_lumberjack_ico.png;lumberjack;;true;false]'..
- 'tooltip[lumberjack;Create a lumberjack (25 lumber, 25 food);black;white]'..
- 'image_button[4.5,2;1,1;kobo_forager_ico.png;forager;;true;false]'..
- 'tooltip[forager;Create a forager (5 lumber, 25 food);black;white]'..
- 'image_button[5.75,2;1,1;kobo_miner_ico.png;miner;;true;false]'..
- 'tooltip[miner;Create a miner (15 lumber, 15 stone, 50 food);black;white]'..
- 'image_button[7,2;1,1;kobo_courier_ico.png;courier;;true;false]'..
- 'tooltip[courier;Create a courier (15 lumber, 5 metal, 50 food);black;white]'..
- 'image_button[8.25,2;1,1;kobo_repairman_ico.png;repairman;;true;false]'..
- 'tooltip[repairman;Create a repairman (15 lumber, 15 metal, 25 food);black;white]'..
- 'image[0,3.75;'..scale..',.25;kobo_health_fg.png]'
- return formspec
- end
- local function base_overview_wrapper(player, pos)
- local refresh = kobo.refresh[player]
- if refresh then
- core.show_formspec(player, 'kobo:base', base_overview(pos))
- core.after(.25, function()
- base_overview_wrapper(player, pos)
- end)
- end
- end
- local function base(player)
- local formspec =
- kobo.building_inv..
- 'textarea[3.25,0;7.5,1;;;'..player..'\'s Town Center]'..
- 'image[0,0;3,3;kobo_base_snap.png]'
- return formspec
- end
- local function game_over()
- local resources = kobo.goblins
- local formspec =
- 'formspec_version[7]'..
- 'size[12,8]'..
- 'background[-1,-1;14,10;kobo_defeat_screen.png]'..
- 'style_type[textarea;textcolor=black;font_size=+10]'..
- 'textarea[0,.125;12,8;;; Aww, too bad, you lose. The goal is to NOT let the goblins destroy your base, maybe that wasn\'t made clear in the instructions. If so my apologies.\n'..
- 'You survived '..resources.wave..' waves of goblins, doubtless you\'ll do better next time.]'
- return formspec
- end
- local base_col = {
- type = 'fixed',
- fixed = {{-.5, -.5, -.5, 1.5, -.4375, 1.5}}
- }
- local base_sel = {
- type = 'fixed',
- fixed = {{-.5, -.5, -.5, 1.5, -.4375, 1.5},
- {.5, -.5, .5, 1.5, 1, 1.5}}
- }
- core.register_node('kobo:base', {
- description = 'Town Center',
- drawtype = 'mesh',
- mesh = 'kobo_base.obj',
- tiles = {'kobo_base.png'},
- paramtype = 'light',
- paramtype2 = 'facedir',
- range = 15,
- selection_box = base_sel,
- collision_box = base_col,
- groups = {storage=1, player_building=1},
- _snapshot = 'kobo_base_snap.png',
- _cost = {1000, 1000, 1000, 1000},
- _health = 500,
- _max_inv = 'No Max',
- _long_desc = 'Your central storage building. You can create villagers here, and they will drop off resources here.',
- after_place_node = function(pos, placer, itemstack)
- local player_name = placer:get_player_name()
- if kobo.space_for_building(pos) then
- local pos_check = vector.subtract(pos, {x=0, y=1, z=0})
- local node_check = core.get_node(pos_check)
- if core.get_item_group(node_check.name, 'ground') > 1 then
- local meta = core.get_meta(pos)
- meta:set_string('owner', player_name)
- meta:set_string('infotext', player_name..'\'s base')
- meta:set_int('health', 500)
- kobo.place_lights(pos)
- kobo.bases[player_name] = core.pos_to_string(pos)
- else
- core.chat_send_player(player_name, 'Place your base on grassy ground.')
- core.remove_node(pos)
- return true
- end
- else
- core.chat_send_player(player_name, 'There is something in the way.')
- core.remove_node(pos)
- return itemstack
- end
- end,
- on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
- local player_name = clicker:get_player_name()
- local meta = core.get_meta(pos)
- local owner = meta:get_string('owner')
- if owner == player_name or core.check_player_privs(clicker, {server = true}) then
- local player_inv = clicker:get_inventory()
- local items = player_inv:get_stack('hand', 1)
- local item_name = items:get_name()
- local item_count = items:get_count()
- local resources = kobo.resources[player_name] or {}
- if item_name == 'kobo:lumber' then
- resources.lumber = resources.lumber + item_count
- elseif item_name == 'kobo:stone' then
- resources.stone = resources.stone + item_count
- elseif item_name == 'kobo:food' then
- resources.food = resources.food + item_count
- elseif item_name == 'kobo:metal' then
- resources.metal = resources.metal + item_count
- end
- player_inv:set_list('hand', {})
- kobo.refresh[player_name] = true
- base_overview_wrapper(player_name, pos)
- kobo.hud_refresh(clicker)
- kobo.player_pos[player_name] = pos
- kobo.save()
- else
- core.show_formspec(player_name, 'kobo:base', base(player_name))
- end
- end,
- on_destruct = function(pos)
- local meta = core.get_meta(pos)
- local owner = meta:get_string('owner')
- core.show_formspec(owner, 'kobo:game_over', game_over())
- end,
- after_destruct = function(pos, oldnode)
- kobo.remove_lights(pos)
- kobo.remove_building_spaces(pos, oldnode)
- end,
- })
- core.register_on_player_receive_fields(function(player, formname, fields)
- local name = player:get_player_name()
- if fields.quit then
- kobo.refresh[name] = false
- end
- if formname == 'kobo:base' then
- if fields.lumberjack then
- local resources = kobo.resources[name] or {}
- if resources.lumber >= 25 and resources.food >= 25 then
- local pos = kobo.player_pos[name]
- local home_pos = vector.add(pos, {x=0, y=1, z=0})
- local lumberjack = minetest.add_entity(pos, 'kobo:lumberjack')
- local lumberjack_entity = lumberjack:get_luaentity()
- lumberjack_entity.owner = name
- lumberjack_entity.home = home_pos
- lumberjack_entity.state = 'idle'
- lumberjack_entity.inv = 0
- resources.lumber = resources.lumber - 25
- resources.food = resources.food - 25
- kobo.hud_refresh(player)
- else
- core.chat_send_player(name, 'You need more resources.')
- end
- elseif fields.forager then
- local resources = kobo.resources[name] or {}
- if resources.lumber >= 25 and resources.food >= 25 then
- local pos = kobo.player_pos[name]
- local home_pos = vector.add(pos, {x=0, y=1, z=0})
- local forager = minetest.add_entity(pos, 'kobo:forager')
- local forager_entity = forager:get_luaentity()
- forager_entity.owner = name
- forager_entity.home = home_pos
- forager_entity.state = 'idle'
- forager_entity.inv = 0
- resources.lumber = resources.lumber - 5
- resources.food = resources.food - 25
- kobo.hud_refresh(player)
- else
- core.chat_send_player(name, 'You need more resources.')
- end
- elseif fields.miner then
- local resources = kobo.resources[name] or {}
- if resources.lumber >= 15 and resources.food >= 50 and resources.stone >= 15 then
- local pos = kobo.player_pos[name]
- local home_pos = vector.add(pos, {x=0, y=1, z=0})
- local miner = minetest.add_entity(pos, 'kobo:miner')
- local miner_entity = miner:get_luaentity()
- miner_entity.owner = name
- miner_entity.home = home_pos
- miner_entity.state = 'idle'
- miner_entity.inv = 0
- miner_entity.mat = ''
- resources.lumber = resources.lumber - 15
- resources.food = resources.food - 50
- resources.stone = resources.stone - 15
- kobo.hud_refresh(player)
- else
- core.chat_send_player(name, 'You need more resources.')
- end
- elseif fields.courier then
- local resources = kobo.resources[name] or {}
- if resources.lumber >= 15 and resources.food >= 50 and resources.metal >= 5 then
- local pos = kobo.player_pos[name]
- local home_pos = vector.add(pos, {x=0, y=1, z=0})
- local courier = minetest.add_entity(pos, 'kobo:courier')
- local courier_entity = courier:get_luaentity()
- courier_entity.owner = name
- courier_entity.home = home_pos
- courier_entity.state = 'idle'
- courier_entity.inv = 0
- courier_entity.mat = ''
- resources.lumber = resources.lumber - 15
- resources.food = resources.food - 50
- resources.metal = resources.metal - 5
- kobo.hud_refresh(player)
- else
- core.chat_send_player(name, 'You need more resources.')
- end
- elseif fields.repairman then
- local resources = kobo.resources[name] or {}
- if resources.lumber >= 15 and resources.food >= 25 and resources.metal >= 15 then
- local pos = kobo.player_pos[name]
- local home_pos = vector.add(pos, {x=0, y=1, z=0})
- local repairman = minetest.add_entity(pos, 'kobo:repairman')
- local repairman_entity = repairman:get_luaentity()
- repairman_entity.owner = name
- repairman_entity.home = home_pos
- repairman_entity.state = 'idle'
- resources.lumber = resources.lumber - 15
- resources.food = resources.food - 25
- resources.metal = resources.metal - 15
- kobo.hud_refresh(player)
- else
- core.chat_send_player(name, 'You need more resources.')
- end
- elseif fields.remove then
- local pos = kobo.player_pos[name]
- -- core.remove_node(pos)
- core.chat_send_player(name, 'You can\'t do that right now.')
- kobo.refresh[name] = false
- core.close_formspec(name, 'kobo:base')
- elseif fields.repair then
- local pos = kobo.player_pos[name]
- local new_pos = vector.add(pos, {x=0, y=1, z=0})
- core.set_node(new_pos, {name='kobo:repair'})
- core.chat_send_player(name, 'Summonend a repairman.')
- elseif fields.quit then
- kobo.refresh[name] = false
- end
- end
- end)
|