git.dumitru.net nush / master lua / itemdefs.lua
master

Tree @master (Download .tar.gz)

itemdefs.lua @masterraw · history · blame

--
--	itemdefs.lua
--	Definitions of individual item types (inheriting from the base Item in
--	item.lua)
--


--	Collection of all item and item type definitions
local Itemdefs = {}

--	This allows recursively requiring actor.lua
package.loaded['lua/itemdefs'] = Itemdefs

local Log = require "lua/log"
local Item = require "lua/item"
local Actor = require "lua/actor"
local Game = require "lua/game"
local UI = require "lua/ui"

--	defineItem() - Given the base item type to inherit from, and a table with
--	overridden data members, returns an item definition
local function defineItem(inheritFrom, definition)
	--	Check for mistakes
	if inheritFrom.new ~= Item.new then
		error("Parent object does not inherit from Item")
	end
	setmetatable(definition, {__index = inheritFrom})
	return definition
end

--	The base item definition all others inherit from (put default values here
--	rather than in Item:new())
Itemdefs.BaseItem = defineItem(Item, {
	category = "Misc",
	name = "",
	face = "",
	color = curses.white,
	stackable = false,
})


--------------------------------- Weapons -------------------------------------

--	Weapons have the following additional members:
--	* minDamage  (int) - min and max damage before modifiers, armour, etc.
--	* maxDamage  (int) - ditto
--	* range      (int) - 0 if melee, otherwise range in tiles

Itemdefs.Weapon = defineItem(Itemdefs.BaseItem, {
	category = "Weapons",
	face = ")",
	attack = "hit",
	examine = function(self)
		local ret = "Class: {{cyan}}" .. self.class .. "{{pop}}\n"
		if self.range == 0 then
			ret = ret .. "Range: immediate"
		else
			ret = ret .. "Range: " .. self.range
		end
		ret = ret .. "   Damage: " .. self.minDamage .. "-" .. self.maxDamage
		if self.ammo then
			ret = ret .. "\nAmmo: " .. self.ammo
			if self.owner == Game.player then
				ret = ret .. " (you have " .. self.owner:ammoAmount(self) .. ")"
			end
		end
		if self.requires then
			ret = ret .. "\nRequires: "
			local first = true
			for k, v in pairs(self.requires) do
				if not first then ret = ret .. ", " end
				local color	--	color of the highlighted skill (red if skill requirement
										--	not met, and green if met)
				if self.owner.skills[k] < v then
					color = "{{red}}"
				else
					color = "{{green}}"
				end
				ret = ret .. color .. k .. ": " .. v .. "{{pop}}"
				first = false
			end
		end
		return ret
	end
})

Itemdefs.MeleeWeapon = defineItem(Itemdefs.Weapon, {
	color = curses.red,
	--equipSlot = Actor.EquipSlots.meleeWeapon,
	equipSlot = "meleeWeapon",
	range = 0,
	class = "Melee",
})

Itemdefs.RangedWeapon = defineItem(Itemdefs.Weapon, {
	color = curses.green,
	--equipSlot = Actor.EquipSlots.rangedWeapon,
	equipSlot = "rangedWeapon",
	attack = "shot",
})

--	Default melee weapon for the player if none equipped
Itemdefs.Fists = defineItem(Itemdefs.MeleeWeapon, {
	name = "Fists",
	minDamage = 0,
	maxDamage = 1,
	accuracy = 0.95,
	attack = "punched",
})

--	These are pretty much placeholders.

Itemdefs.ShockBaton = defineItem(Itemdefs.MeleeWeapon, {
	name = "Shock baton",
	info = "A damaging electrified club without the hassle of lugging heavy equipment.",
	minDamage = 1,
	maxDamage = 3,
	accuracy = 0.95,
	requires = { ["melee"] = 2 },
})

Itemdefs.DilithiumRazor = defineItem(Itemdefs.MeleeWeapon, {
	name = "Dilithium razor",
	info = "As sharp as it is light.",
	minDamage = 2,
	maxDamage = 5,
	accuracy = 0.9,
	attack = "cut",
	requires = { ["melee"] = 4 },
})

Itemdefs.RustyKnife = defineItem(Itemdefs.MeleeWeapon, {
	name = "Rusty knife",
	info = "Its corroded blade will surely spawn an infection or two if you poke it into some poor dweller.",
	minDamage = 1,
	maxDamage = 3,
	accuracy = 0.8,
	attack = "cut",
})

Itemdefs.BrassKnuckles = defineItem(Itemdefs.MeleeWeapon, {
	name = "Brass knuckles",
	info = "If you like punching things, you'll like these a lot.",
	minDamage = 1,
	maxDamage = 2,
	accuracy = 0.8,
	attack = "punched",
})

Itemdefs.Handgun = defineItem(Itemdefs.RangedWeapon, {
	class = "Handgun",
})

Itemdefs.Pistol = defineItem(Itemdefs.Handgun, {
	name = "Pistol",
	info = "Ancient and unreliable projectile weapon still effective at putting holes into things.",
	range = 10,
	minDamage = 1,
	maxDamage = 5,
	accuracy = 0.6,
	ammo = "Bullet",
	attack = "shot",
	requires = { ["handguns"] = 3 },
})

Itemdefs.Phaser = defineItem(Itemdefs.Handgun, {
	name = "Phaser pistol",
	info = "Fires a concentrated blast of something or other.",
	range = 6,
	minDamage = 2,
	maxDamage = 8,
	accuracy = 0.7,
	ammo = "Energy Cell",
	attack = "lasered",
	requires = { ["handguns"] = 5 },
})

Itemdefs.Shotgun = defineItem(Itemdefs.RangedWeapon, {
	class = "Shotgun",
	ammo = "Slug",
})

Itemdefs.SingleShotgun = defineItem(Itemdefs.Shotgun, {
	name = "Single shotgun",
	info = "The weapon of choice of the close range kill afficionado.",
	range = 4,
	minDamage = 2,
	maxDamage = 4,
	accuracy = 0.6,
	attack = "shot",
	requires = { ["shotguns"] = 2 },
})

Itemdefs.SawedOffShotgun = defineItem(Itemdefs.Shotgun, {
	name = "Sawed-off shotgun",
	info = "More portable, more deadly, less accurate than its cousin.",
	range = 4,
	minDamage = 2,
	maxDamage = 5,
	accuracy = 0.5,
	attack = "shot",
	requires = { ["shotguns"] = 2 },
})

--------------------------------- Keycards ------------------------------------

Itemdefs.Keycard = defineItem(Itemdefs.BaseItem, {
	category = "Keycards",
	face = "$",
	info = "Opens a door of the corresponding color.",
})

Itemdefs.RedKeycard = defineItem(Itemdefs.Keycard, {
	name = "Red keycard",
	color = curses.red,
})

Itemdefs.GreenKeycard = defineItem(Itemdefs.Keycard, {
	name = "Green keycard",
	color = curses.green,
})

Itemdefs.BlueKeycard = defineItem(Itemdefs.Keycard, {
	name = "Blue keycard",
	color = curses.blue,
})

Itemdefs.SilverKeycard = defineItem(Itemdefs.Keycard, {
	name = "Silver keycard",
	color = curses.WHITE,
})

Itemdefs.GoldKeycard = defineItem(Itemdefs.Keycard, {
	name = "Gold keycard",
	color = curses.YELLOW,
})


-------------------------------- Consumables ----------------------------------

Itemdefs.Consumable = defineItem(Itemdefs.BaseItem, {
	category = "Consumables",
	face = "&",
	consumable = true,
	stackable = true,
	count = 1,
})

Itemdefs.SugarBombs = defineItem(Itemdefs.Consumable, {
	name = "Sugar Bombs",
	info = "Excessively sugary breakfast cereal.",
	color = curses.CYAN,
	apply = function(self, actor)
		actor:setHp(math.min(actor.hp + 2, actor.maxHp))
		if actor == Game.player then
			UI:message("{{green}}Those sugar bombs were delicious!")
		end
		--	returns true to indicate that an item should be consumed
		return true
	end
})


----------------------------------- Corpses -----------------------------------

Itemdefs.Corpse = defineItem(Itemdefs.BaseItem, {
	category = "Corpses",
	face = "%",
})

Itemdefs["Savage corpse"] = defineItem(Itemdefs.Corpse, {
	name = "Savage corpse",
	info = "The remaining carcass of a once living Savage.",
	color = curses.red,
})

Itemdefs["Savage Chief corpse"] = defineItem(Itemdefs.Corpse, {
	name = "Savage Chief corpse",
	info = "The remaining carcass of a once living Savage Chief.",
	color = curses.red,
})

Itemdefs["Savage Shaman corpse"] = defineItem(Itemdefs.Corpse, {
	name = "Savage Shaman corpse",
	info = "The remaining carcass of a once living Savage Shaman.",
	color = curses.red
})

Itemdefs["Rat corpse"] = defineItem(Itemdefs.Corpse, {
	name = "Rat corpse",
	info = "The remaining carcass of a once living Rat.",
	color = curses.yellow
})

-------------------------------------- Ammo -----------------------------------

Itemdefs.Ammo = defineItem(Itemdefs.BaseItem, {
	category = "Ammo",
	face = "=",
	stackable = true,
	count = 1,
})

Itemdefs.Bullet = defineItem(Itemdefs.Ammo, {
	name = "Bullet",
	color = curses.yellow,
})

Itemdefs.EnergyCell = defineItem(Itemdefs.Ammo, {
	name = "Energy Cell",
	color = curses.cyan,
})

Itemdefs.Slug = defineItem(Itemdefs.Ammo, {
	name = "Slug",
	color = curses.red
})

------------------------------------- Misc ------------------------------------

Itemdefs.Rock = defineItem(Itemdefs.BaseItem, {
	category = "Misc",
	name = "Rock",
	info = "A plain rock - nothing of significance.",
	face = "*",
	color = curses.yellow,
	stackable = true,
	count = 1,
})

Itemdefs.Stick = defineItem(Itemdefs.BaseItem, {
	category = "Misc",
	name = "Stick",
	info = "A stick made of wood, often used as a tool by savages.",
	face = "(",
	color = curses.yellow,
	stackable = true,
	count = 1,
})

return Itemdefs