Initial implementation
|
@ -0,0 +1,522 @@
|
|||
local exertion = select(1, ...);
|
||||
local settings = exertion.settings;
|
||||
|
||||
|
||||
local PLAYER_DB_FILE =
|
||||
minetest.get_worldpath() .. "/" ..
|
||||
exertion.MOD_NAME .. "_playerStatesDb.json";
|
||||
local SECONDS_PER_DAY =
|
||||
(function()
|
||||
local ts = tonumber(minetest.setting_get("time_speed"));
|
||||
if not ts or ts <= 0 then ts = 72; end;
|
||||
return 24 * 60 * 60 / ts;
|
||||
end)();
|
||||
local DF_DT = settings.food_perDay / SECONDS_PER_DAY;
|
||||
local DW_DT = settings.water_perDay / SECONDS_PER_DAY;
|
||||
local DP_DT = settings.poison_perDay / SECONDS_PER_DAY;
|
||||
local DHP_DT = settings.healing_perDay / SECONDS_PER_DAY;
|
||||
|
||||
|
||||
local function clamp(x, min, max)
|
||||
if x < min then
|
||||
return min;
|
||||
elseif x > max then
|
||||
return max;
|
||||
else
|
||||
return x;
|
||||
end;
|
||||
end;
|
||||
|
||||
local gameToWallTime;
|
||||
local wallToGameTime;
|
||||
do
|
||||
local ts = tonumber(minetest.setting_get("time_speed"));
|
||||
if not ts or ts <= 0 then ts = 72; end;
|
||||
local WALL_MINUS_GAME = os.time() - minetest.get_gametime();
|
||||
|
||||
gameToWallTime = function(tg)
|
||||
return tg + WALL_MINUS_GAME;
|
||||
end
|
||||
|
||||
wallToGameTime = function(tw)
|
||||
return tw - WALL_MINUS_GAME;
|
||||
end
|
||||
end
|
||||
|
||||
local function calcMultiplier(mt,
|
||||
exertionStatus,
|
||||
fedStatus,
|
||||
hydratedStatus,
|
||||
poisonedStatus)
|
||||
local em = mt.exertion[exertionStatus] or 1.0;
|
||||
local fm = mt.fed[fedStatus] or 1.0;
|
||||
local hm = mt.hydrated[hydratedStatus] or 1.0;
|
||||
local pm = mt.poisoned[poisonedStatus] or 1.0;
|
||||
return em * fm * hm * pm;
|
||||
end;
|
||||
|
||||
local function canDrink(player)
|
||||
local p = player:getpos();
|
||||
local hn = minetest.get_node({ x = p.x, y = p.y + 1, z = p.z });
|
||||
if not hn or hn.name ~= "air" then return false; end;
|
||||
return minetest.find_node_near(p, settings.drinkDistance, "group_water");
|
||||
end;
|
||||
|
||||
|
||||
--- Manages player state for the exertion mod.
|
||||
--
|
||||
-- @author presitidigitator (as reistered at forum.minetest.net).
|
||||
-- @copyright 2015, licensed under WTFPL
|
||||
--
|
||||
local PlayerState = { db = {} };
|
||||
local PlayerState_meta = {};
|
||||
local PlayerState_ops = {};
|
||||
local PlayerState_inst_meta = {};
|
||||
|
||||
setmetatable(PlayerState, PlayerState_meta);
|
||||
PlayerState_inst_meta.__index = PlayerState_ops;
|
||||
|
||||
--- Constructs a PlayerState, loading from the database if present there, or
|
||||
-- initializing to an initial state otherwise.
|
||||
--
|
||||
-- Call with one of:
|
||||
-- PlayerState.new(player)
|
||||
-- PlayerState(player)
|
||||
--
|
||||
-- @return a new PlayerState object
|
||||
--
|
||||
function PlayerState.new(player)
|
||||
local playerName = player:get_player_name();
|
||||
if not playerName or playerName == "" then
|
||||
error("Argument is not a player");
|
||||
end;
|
||||
|
||||
local state = PlayerState.db[playerName];
|
||||
local newState = false;
|
||||
if not state then
|
||||
state = {};
|
||||
PlayerState.db[playerName] = state;
|
||||
newState = true;
|
||||
end;
|
||||
|
||||
local self =
|
||||
setmetatable({ player = player, state = state; }, PlayerState_inst_meta);
|
||||
self:initialize(newState);
|
||||
|
||||
return self;
|
||||
end;
|
||||
PlayerState_meta.__call =
|
||||
function(class, ...) return PlayerState.new(...); end;
|
||||
|
||||
--- Loads the PlayerState DB from the world directory (call only when the mod
|
||||
-- is first loaded).
|
||||
function PlayerState.load()
|
||||
local playerDbFile = io.open(PLAYER_DB_FILE, 'r');
|
||||
if playerDbFile then
|
||||
local ps = minetest.parse_json(playerDbFile:read('*a'));
|
||||
if ps then PlayerState.db = ps; end;
|
||||
playerDbFile:close();
|
||||
end;
|
||||
end;
|
||||
|
||||
function PlayerState.save()
|
||||
local playerDbFile = io.open(PLAYER_DB_FILE, 'w');
|
||||
if playerDbFile then
|
||||
local json, err = minetest.write_json(PlayerState.db);
|
||||
if not json then playerDbFile:close(); error(err); end;
|
||||
playerDbFile:write(json);
|
||||
playerDbFile:close();
|
||||
end;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:initialize(newState)
|
||||
local tw = os.time();
|
||||
local tg = minetest.get_gametime();
|
||||
if newState then
|
||||
self.state.fed = settings.fedMaximum;
|
||||
self.state.hydrated = settings.hydratedMaximum;
|
||||
self.state.poisoned = 0;
|
||||
self.state.foodLost = 0;
|
||||
self.state.waterLost = 0;
|
||||
self.state.poisonLost = 0;
|
||||
self.state.hpGained = 0;
|
||||
self.state.airLost = 0;
|
||||
self.state.updateGameTime = tg;
|
||||
self.state.updateWallTime = tw;
|
||||
|
||||
self.activity = 0;
|
||||
self.activityPolls = 0;
|
||||
self.builds = 0;
|
||||
|
||||
self:updatePhysics();
|
||||
self:updateHud();
|
||||
else
|
||||
local dt;
|
||||
if settings.useWallclock and
|
||||
self.state.updateWallTime and
|
||||
self.state.updateWallTime <= tw
|
||||
then
|
||||
dt = tw - self.state.updateWallTime;
|
||||
elseif self.state.updateGameTime and
|
||||
self.state.updateGameTime <= tg
|
||||
then
|
||||
dt = tg - self.state.updateGameTime;
|
||||
else
|
||||
dt = 0;
|
||||
end;
|
||||
|
||||
self.state.fed = self.state.fed or 0;
|
||||
self.state.hydrated = self.state.hydrated or 0;
|
||||
self.state.poisoned = self.state.poisoned or 0;
|
||||
self.state.foodLost = self.state.foodLost or 0;
|
||||
self.state.waterLost = self.state.waterLost or 0;
|
||||
self.state.poisonLost = self.state.poisonLost or 0;
|
||||
self.state.hpGained = self.state.hpGained or 0;
|
||||
self.state.airLost = 0;
|
||||
|
||||
self.activity = 0;
|
||||
self.activityPolls = 0;
|
||||
self.builds = 0;
|
||||
|
||||
self:update(tw, dt);
|
||||
end;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:calcExertionStatus()
|
||||
local polls = self.activityPolls;
|
||||
local ar = (polls > 0 and self.activity / polls) or 0;
|
||||
local b = self.builds;
|
||||
|
||||
local status = nil;
|
||||
local priority = nil;
|
||||
for s, c in pairs(settings.exertionStatuses) do
|
||||
if c then
|
||||
local pc = c.priority;
|
||||
if not priority or (pc and pc > priority) then
|
||||
local arc = c.activityRatio;
|
||||
local bc = c.builds;
|
||||
if (arc and ar >= arc) or (bc and b >= bc)
|
||||
then
|
||||
status = s;
|
||||
priority = pc;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
return status or 'none';
|
||||
end;
|
||||
|
||||
function PlayerState_ops:calcFedStatus()
|
||||
local fed = self.state.fed;
|
||||
|
||||
local status = nil;
|
||||
local threshold = nil;
|
||||
for s, t in pairs(settings.fedStatuses) do
|
||||
if t > threshold and fed >= t then
|
||||
status = s;
|
||||
threshold = t;
|
||||
end;
|
||||
end;
|
||||
|
||||
return status or 'none';
|
||||
end;
|
||||
|
||||
function PlayerState_ops:calcHydratedStatus()
|
||||
local hyd = self.state.hydrated;
|
||||
|
||||
local status = nil;
|
||||
local threshold = nil;
|
||||
for s, t in pairs(settings.hydratedStatuses) do
|
||||
if t > threshold and hyd >= t then
|
||||
status = s;
|
||||
threshold = t;
|
||||
end;
|
||||
end;
|
||||
|
||||
return status or 'none';
|
||||
end;
|
||||
|
||||
function PlayerState_ops:calcPoisonedStatus()
|
||||
local poi = self.state.poisoned;
|
||||
|
||||
local status = nil;
|
||||
local threshold = nil;
|
||||
for s, t in pairs(settings.poisonedStatuses) do
|
||||
if t > threshold and poi >= t then
|
||||
status = s;
|
||||
threshold = t;
|
||||
end;
|
||||
end;
|
||||
|
||||
return status or 'none';
|
||||
end;
|
||||
|
||||
function PlayerState_ops:addFood(df)
|
||||
local fedChanged = false;
|
||||
|
||||
if df > 0 then
|
||||
if df >= 1.0 then
|
||||
local dfn, dff = math.modf(df);
|
||||
self.state.fed = clamp(self.state.fed + dfn, 0, settings.fedMaximum);
|
||||
if self.state.foodLost < 0 then
|
||||
self.state.foodLost = self.state.foodLost - dff;
|
||||
else
|
||||
self.state.foodLost = -dff;
|
||||
end;
|
||||
fedChanged = true;
|
||||
else
|
||||
self.state.foodLost = self.state.foodLost - df;
|
||||
end;
|
||||
elseif df < 0 then
|
||||
df = self.state.foodLost - df; -- now positive
|
||||
if df >= 1.0 then
|
||||
local dfn, dff = math.modf(df);
|
||||
self.state.fed = clamp(self.state.fed - dfn, 0, setttings.fedMaximum);
|
||||
self.state.foodLost = dff;
|
||||
fedChanged = true;
|
||||
else
|
||||
self.state.foodLost = df;
|
||||
end;
|
||||
end;
|
||||
|
||||
return fedChanged;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:addWater(dw)
|
||||
local hydratedChanged = false;
|
||||
|
||||
if dw > 0 then
|
||||
if dw >= 1.0 then
|
||||
local dwn, dwf = math.modf(dw);
|
||||
self.state.hydrated =
|
||||
clamp(self.state.hydrated + dwn, 0, settings.hydratedMaximum);
|
||||
if self.state.waterLost < 0 then
|
||||
self.state.waterLost = self.state.waterLost - dwf;
|
||||
else
|
||||
self.state.waterLost = -dwf;
|
||||
end;
|
||||
hydratedChanged = true;
|
||||
else
|
||||
self.state.waterLost = self.state.waterLost - dw;
|
||||
end;
|
||||
elseif dw < 0 then
|
||||
dw = self.state.waterLost - dw; -- now positive
|
||||
if dw >= 1.0 then
|
||||
local dwn, dwf = math.modf(dw);
|
||||
self.state.hydrated =
|
||||
clamp(self.state.hydrated - dwn, 0, setttings.hydratedMaximum);
|
||||
self.state.waterLost = dwf;
|
||||
hydratedChanged = true;
|
||||
else
|
||||
self.state.waterLost = dw;
|
||||
end;
|
||||
end;
|
||||
|
||||
return hydratedChanged;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:addPoison(dp)
|
||||
local poisonedChanged = false;
|
||||
|
||||
if dp > 0 then
|
||||
local dpn = math.ceil(dp);
|
||||
local dpf = dpn - dp;
|
||||
self.state.poisoned =
|
||||
clamp(self.state.poisoned + dpn, 0, settings.poisonedMaximum);
|
||||
self.state.poisonLost = 0;
|
||||
poisonedChanged = true;
|
||||
elseif dp < 0 then
|
||||
dp = self.state.poisonLost - dp; -- now positive
|
||||
if dp >= 1.0 then
|
||||
local dpn, dpf = math.modf(dp);
|
||||
self.state.poisoned =
|
||||
clamp(self.state.poisoned - dpn, 0, setttings.poisonMaximum);
|
||||
self.state.poisonLost = dpf;
|
||||
poisonedChanged = true;
|
||||
else
|
||||
self.state.poisonLost = dp;
|
||||
end;
|
||||
end;
|
||||
|
||||
return poisonedChanged;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:addHp(dhp)
|
||||
local hpChanged = false;
|
||||
|
||||
dhp = self.state.hpGained + dhp;
|
||||
if dhp < 0 or dhp >= 1.0 then
|
||||
local dhpf = dhp % 1.0;
|
||||
local dhpn = dhp - dhpf;
|
||||
self.player:set_hp(self.player:get_hp() + dhpn);
|
||||
self.state.hpGained = dhpf;
|
||||
hpChanged = true;
|
||||
else
|
||||
self.state.hpGained = dhp;
|
||||
end;
|
||||
|
||||
return hpChanged;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:addBreath(db)
|
||||
local player = self.player;
|
||||
local b0 = player:get_breath();
|
||||
local breathChanged = false;
|
||||
|
||||
if b0 < 11 then
|
||||
if db > 0 then
|
||||
if db > 1.0 then
|
||||
local dbn, dbf = math.modf(db);
|
||||
player:set_breath(b0 + dbn);
|
||||
self.state.airLost = -dbf;
|
||||
breathChanged = true;
|
||||
else
|
||||
self.state.airLost = self.state.airLost - db;
|
||||
end;
|
||||
elseif db < 0 then
|
||||
db = self.state.airLost - db; -- now positive
|
||||
if db > 1.0 then
|
||||
local dbn, dbf = math.modf(db);
|
||||
player:set_breath(b0 - dbn);
|
||||
self.state.airLost = dbf;
|
||||
breathChanged = true;
|
||||
else
|
||||
self.state.airLost = db;
|
||||
end;
|
||||
end;
|
||||
else
|
||||
self.state.airLost = 0;
|
||||
end;
|
||||
|
||||
return breathChanged;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:update(tw, dt)
|
||||
local player = self.player;
|
||||
if tw == nil then tw = os.time(); end;
|
||||
if dt == nil then dt = tw - self.state.updateWallTime; end;
|
||||
if dt < 0 then return; end;
|
||||
|
||||
local hudChanged = false;
|
||||
local es = self:calcExertionStatus();
|
||||
local fs = self:calcFedStatus();
|
||||
local hs = self:calcHydratedStatus();
|
||||
local ps = self:calcPoisonedStatus();
|
||||
|
||||
local retchProb = poisonedRetchProbabilities_perPeriod[ps];
|
||||
local retching = retchProb and math.random() <= retchProb;
|
||||
|
||||
if self.state.fed > 0 then
|
||||
local fm = calcMultiplier(settings.foodMultipliers, es, fs, hs, ps);
|
||||
local df = -DF_DT * fm * dt;
|
||||
if retching then df = df - settings.retchingFoodLoss; end;
|
||||
hudChanged = self:addFood(df) or hudChanged;
|
||||
end;
|
||||
|
||||
if canDrink(player) then
|
||||
hudChanged = self:addWater(setting.drinkAmount_perPeriod) or hudChanged;
|
||||
elseif self.state.hydrated > 0 then
|
||||
local wm = calcMultiplier(settings.waterMultipliers, es, fs, hs, ps);
|
||||
local dw = -DW_DT * wm * dt;
|
||||
if retching then dw = dw - settings.retchingWaterLoss; end;
|
||||
hudChanged = self:addWater(dw) or hudChanged;
|
||||
end;
|
||||
|
||||
if self.state.poisoned > 0 then
|
||||
local dp = -DP_DT * dt;
|
||||
hudChanged = self:addPoison(dp) or hudChanged;
|
||||
end;
|
||||
|
||||
local hpm = calcMultiplier(settings.healingMultipliers, es, fs, hs, ps);
|
||||
local dhp = DHP_DT * hpm * dt;
|
||||
if retching then dhp = dhp - settings.retchingDamage; end;
|
||||
self:addHp(dhp);
|
||||
|
||||
self:addBreath((retching and -settings.retchingAirLoss) or 0);
|
||||
|
||||
if retching then
|
||||
player:set_physics_override({ speed = 0, jump = 0 });
|
||||
minetest.after(settings.retchDuration_seconds,
|
||||
self.updatePhysics, self, es, fs, hs, ps);
|
||||
else
|
||||
self:updatePhysics(es, fs, hs, ps);
|
||||
end;
|
||||
|
||||
if hudChanged then self:updateHud(); end;
|
||||
|
||||
self.activity = 0;
|
||||
self.activityPolls = 0;
|
||||
self.builds = 0;
|
||||
self.state.updateGameTime = wallToGameTime(tg);
|
||||
self.state.updateWallTime = tw;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:updatePhysics(es, fs, hs, ps)
|
||||
if not es then es = self:calcExertionStatus(); end;
|
||||
if not fs then fs = self:calcFedStatus(); end;
|
||||
if not hs then hs = self:calcHydratedStatus(); end;
|
||||
if not ps then ps = self:calcPoisonedStatus(); end;
|
||||
|
||||
local sm = calcMultiplier(settings.speedMultipliers, es, fs, hs, ps);
|
||||
local jm = calcMultiplier(settings.jumpMultipliers, es, fs, hs, ps);
|
||||
|
||||
self.player:set_physics_override({ speed = sm, jump = jm });
|
||||
end;
|
||||
|
||||
function PlayerState_ops:updateHud()
|
||||
local player = self.player;
|
||||
|
||||
local fh = self.fedHudId;
|
||||
if not fh then
|
||||
fh = player:hud_add(settings.fedHud);
|
||||
self.fedHudId = fh;
|
||||
end;
|
||||
player:hud_change(fh, 'number', self.state.fed);
|
||||
|
||||
local hh = self.hydratedHudId;
|
||||
if not fh then
|
||||
hh = player:hud_add(settings.hydratedHud);
|
||||
self.hydratedHudId = hh;
|
||||
end;
|
||||
player:hud_change(hh, 'number', self.state.hydrated);
|
||||
|
||||
local ph = self.poisonedHudId;
|
||||
if not fh then
|
||||
ph = player:hud_add(settings.poisonedHud);
|
||||
self.poisonedHudId = ph;
|
||||
end;
|
||||
player:hud_change(ph, 'number', self.state.poisoned);
|
||||
end;
|
||||
|
||||
function PlayerState_ops:pollForActivity()
|
||||
local player = self.player;
|
||||
|
||||
self.activityPolls = self.activityPolls + 1;
|
||||
|
||||
local activeControls = player:get_player_control();
|
||||
local testControls = settings.exertionControls;
|
||||
for _, ctrl in ipairs(testControls) do
|
||||
if activeControls[ctrl] then
|
||||
self.activity = self.activity + 1;
|
||||
return;
|
||||
end;
|
||||
end;
|
||||
|
||||
if player:get_breath() <= settings.exertionHoldingBreathMax then
|
||||
self.activity = self.activity + 1;
|
||||
return;
|
||||
end;
|
||||
end;
|
||||
|
||||
function PlayerState_ops:markBuildAction(node)
|
||||
local nodeName = node.name;
|
||||
if not (minetest.get_node_group(nodeName, "oddly_breakable_by_hand") > 0 or
|
||||
minetest.get_node_group(nodeName, "dig_immediate") > 0)
|
||||
then
|
||||
self.builds = self.builds + 1;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
return PlayerState;
|
|
@ -0,0 +1 @@
|
|||
default
|
|
@ -0,0 +1,99 @@
|
|||
local MOD_NAME = minetest.get_current_modname() or "exertion";
|
||||
local MOD_PATH = minetest.get_modpath();
|
||||
|
||||
local exertion = { MOD_NAME = MOD_NAME, MOD_PATH = MOD_PATH };
|
||||
_G[MOD_NAME] = exertion;
|
||||
|
||||
|
||||
local function callFile(fileName, ...)
|
||||
local chunk, err = loadfile(MOD_PATH .. "/" .. fileName);
|
||||
if not chunk then error(err); end;
|
||||
return chunk(...);
|
||||
end;
|
||||
|
||||
|
||||
local settings = callFile("loadSettings.lua", exertion);
|
||||
exertion.settings = settings;
|
||||
|
||||
local PlayerState = callFile("PlayerState.lua", exertion);
|
||||
exertion.PlayerState = PlayerState;
|
||||
|
||||
|
||||
PlayerState.load();
|
||||
local playerStates = {};
|
||||
|
||||
minetest.register_on_joinplayer(
|
||||
function(player)
|
||||
minetest.after(
|
||||
0, function() playerStates[player] = PlayerState(player); end);
|
||||
end);
|
||||
|
||||
minetest.register_on_leaveplayer(
|
||||
function(player)
|
||||
playerStates[player] = nil;
|
||||
end);
|
||||
|
||||
minetest.register_on_shutdown(PlayerState.save);
|
||||
|
||||
minetest.register_on_dignode(
|
||||
function(pos, oldNode, digger)
|
||||
local ps = playerStates[digger];
|
||||
if ps then ps:markBuildAction(oldNode); end;
|
||||
end);
|
||||
|
||||
minetest.register_on_placenode(
|
||||
function(pos, newNode, placer, oldNode, itemStack, pointedThing)
|
||||
local ps = playerStates[placer];
|
||||
if ps then ps:markBuildAction(newNode); end;
|
||||
end);
|
||||
|
||||
local controlPeriod = settings.controlTestPeriod_seconds;
|
||||
local updatePeriod = settings.accountingPeriod_seconds;
|
||||
local savePeriod = settings.savePeriod_seconds;
|
||||
local controlTime = 0.0;
|
||||
local updateTime = 0.0;
|
||||
local saveTime = 0.0;
|
||||
minetest.register_globalstep(
|
||||
function(dt)
|
||||
controlTime = controlTime + dt;
|
||||
if controlTime >= controlPeriod then
|
||||
for _, ps in pairs(playerStates) do
|
||||
ps:pollForActivity();
|
||||
end;
|
||||
controlTime = 0;
|
||||
end;
|
||||
|
||||
updateTime = updateTime + dt;
|
||||
if updateTime >= updatePeriod then
|
||||
controlPeriod = settings.controlTestPeriod_seconds;
|
||||
updatePeriod = settings.accountingPeriod_seconds;
|
||||
local tw = os.time();
|
||||
for _, ps in pairs(playerStates) do
|
||||
ps:update(tw, updateTime);
|
||||
end;
|
||||
updateTime = 0;
|
||||
end;
|
||||
|
||||
saveTime = saveTime + dt;
|
||||
if saveTime >= savePeriod then
|
||||
savePeriod = settings.savePeriod_seconds;
|
||||
PlayerState.save();
|
||||
saveTime = 0;
|
||||
end;
|
||||
end);
|
||||
|
||||
minetest.register_on_item_eat(
|
||||
function(hpChange, replacementItem, itemStack, player, pointedThing)
|
||||
if itemStack:take_item() ~= nil then
|
||||
local ps = playerStates[player];
|
||||
if ps then
|
||||
if hpChange > 0 then
|
||||
ps:addFood(hpChange);
|
||||
elseif hpChange < 0 then
|
||||
ps:addPoison(-hpChange);
|
||||
end;
|
||||
end;
|
||||
itemStack:add_item(replacementItem);
|
||||
end;
|
||||
return itemStack;
|
||||
end);
|
|
@ -0,0 +1,51 @@
|
|||
local exertion = select(1, ...) or exertion;
|
||||
local MOD_SETTINGS_FILE =
|
||||
exertion.MOD_PATH .. "/settings.lua";
|
||||
local WORLD_SETTINGS_FILE =
|
||||
minetest.get_worldpath() .. "/" .. exertion.MOD_NAME .. "_settings.lua";
|
||||
|
||||
local settings = {};
|
||||
|
||||
local function loadSettingsFile(filePath)
|
||||
-- test for existence/readability
|
||||
local file = io.open(filePath, 'r');
|
||||
if not file then return nil; end;
|
||||
file:close();
|
||||
|
||||
local chunk, err = loadfile(filePath);
|
||||
return chunk or error(err);
|
||||
end;
|
||||
|
||||
local modSettingsFunc = loadSettingsFile(MOD_SETTINGS_FILE);
|
||||
local worldSettingsFunc = loadSettingsFile(WORLD_SETTINGS_FILE);
|
||||
if not modSettingsFunc and not worldSettingsFunc then return settings; end;
|
||||
|
||||
-- Setting any "global" variable in the settings files actually modifies the
|
||||
-- settings table (unless the variable is accessed through another existing
|
||||
-- table like _G).
|
||||
local settingsEnv =
|
||||
setmetatable(
|
||||
{},
|
||||
{
|
||||
__index = function(self, key)
|
||||
local v = settings[key];
|
||||
if v ~= nil then return v; else return _G[key]; end;
|
||||
end,
|
||||
|
||||
__newindex = function(self, key, value)
|
||||
settings[key] = value;
|
||||
return true;
|
||||
end,
|
||||
});
|
||||
|
||||
if modSettingsFunc then
|
||||
setfenv(modSettingsFunc, settingsEnv);
|
||||
modSettingsFunc();
|
||||
end;
|
||||
|
||||
if worldSettingsFunc then
|
||||
setfenv(worldSettingsFunc, settingsEnv);
|
||||
worldSettingsFunc();
|
||||
end;
|
||||
|
||||
return settings;
|
|
@ -0,0 +1,414 @@
|
|||
--- Basic Definitions
|
||||
|
||||
-- Food points (half-icons) for the the maximum, fully fed bar.
|
||||
--
|
||||
-- default: fedMaximum = 20;
|
||||
--
|
||||
fedMaximum = 20;
|
||||
|
||||
-- Water points (half-icons) for the the maximum, fully hydrated bar.
|
||||
--
|
||||
-- default: hydratedMaximum = 20;
|
||||
--
|
||||
hydratedMaximum = 20;
|
||||
|
||||
-- Poison points (half-icons) for the maximum poisoned amount.
|
||||
--
|
||||
-- default: poisonMaximum = 4;
|
||||
--
|
||||
poisonMaximum = 4;
|
||||
|
||||
|
||||
--- Rates and Times
|
||||
|
||||
-- Whether to use wallclock time, so fed and hydrated amounts go down not just
|
||||
-- when logged off, but when the server isn't running (falls back to game time
|
||||
-- if server's time has been set backwards enough to "go back in time"). Note
|
||||
-- that poison is NOT modified while logged out, though it also doesn't cause
|
||||
-- damage, etc.
|
||||
--
|
||||
-- default: useWallclock = true;
|
||||
--
|
||||
useWallclock = true;
|
||||
|
||||
-- Base amount of food that needs to be consumed each day to stay fed, in both
|
||||
-- points (half-icons) and conventional food "HP gain".
|
||||
--
|
||||
-- default: food_perDay = 4;
|
||||
--
|
||||
food_perDay = 4;
|
||||
|
||||
-- Base amount of water (hydration) lost each day, in points (half-icons).
|
||||
--
|
||||
-- default: water_perDay = 8;
|
||||
--
|
||||
water_perDay = 8;
|
||||
|
||||
-- Amount poison decreases each day, in points (half-icons).
|
||||
--
|
||||
-- default: poison_perDay = 4;
|
||||
--
|
||||
poison_perDay = 4;
|
||||
|
||||
-- Amount HP (half-icons) healed per day if properly fed, hydrated, and not
|
||||
-- poisoned.
|
||||
--
|
||||
-- default: healing_perDay = 4;
|
||||
--
|
||||
healing_perDay = 4;
|
||||
|
||||
-- Distance water must be from player while player's head is in air to drink.
|
||||
--
|
||||
-- default: drinkingDistance = 1.5;
|
||||
--
|
||||
drinkDistance = 1;
|
||||
|
||||
-- Amount of water to drink in points (half-icons) each period when able.
|
||||
--
|
||||
-- default: drinkAmount_perPeriod = 4.0;
|
||||
--
|
||||
drinkAmount_perPeriod = 4.0;
|
||||
|
||||
-- Period between tests of user controls for testing movement exertion.
|
||||
-- Decrease if not responsive enough; increase if its creating too much server
|
||||
-- lag.
|
||||
--
|
||||
-- default: controlTestPeriod_seconds = 0.1;
|
||||
--
|
||||
controlTestPeriod_seconds = 0.1;
|
||||
|
||||
-- Length of an accounting period.
|
||||
--
|
||||
-- default: accountingPeriod_seconds = 30.0;
|
||||
--
|
||||
accountingPeriod_seconds = 30.0;
|
||||
|
||||
-- Amount of time spent retching (can't walk or jump).
|
||||
--
|
||||
-- default: retchDuration_seconds = 2.0;
|
||||
--
|
||||
retchDuration_seconds = 2.0;
|
||||
|
||||
-- Time between saves.
|
||||
--
|
||||
-- default: savePeriod_seconds = 300.0;
|
||||
--
|
||||
savePeriod_seconds = 300.0;
|
||||
|
||||
|
||||
--- Enumerated Statuses
|
||||
|
||||
-- Status values indicating how hard the player is exerting him-/herself. Each
|
||||
-- key is a status value. Each value is a condition object indicating when
|
||||
-- the player has that status. Each condition object has the following fields:
|
||||
-- * priority - The status that is used is the one with the highest priority
|
||||
-- and any of its condition(s) met.
|
||||
-- * activityRatio - The minimum ratio of strenuous movement/breath
|
||||
-- activities noted to total number of times activity is polled in an
|
||||
-- accounting period to meet the status condition.
|
||||
-- * builds - The minimum number of digs or node placements that must occur
|
||||
-- during an accounting period to meet the status condition. Nodes
|
||||
-- with the 'dig_immediate' and/or 'oddly_breakable_by_hand' groups are
|
||||
-- not counted.
|
||||
-- If no status conditions are met, the special status 'none' is used.
|
||||
--
|
||||
-- defaults:
|
||||
-- exertionStatuses = exertionStatuses or {};
|
||||
-- exertionStatuses.light =
|
||||
-- { priority = 1, activityRatio = 0.25, builds = 10 };
|
||||
-- exertionStatuses.heavy =
|
||||
-- { priority = 2, activityRatio = 0.75, builds = 20 };
|
||||
--
|
||||
exertionStatuses = exertionStatuses or {};
|
||||
exertionStatuses.light =
|
||||
{ priority = 1, activityRatio = 0.25, builds = 10 };
|
||||
exertionStatuses.heavy =
|
||||
{ priority = 2, activityRatio = 0.75, builds = 20 };
|
||||
|
||||
-- Status values indicating how well fed the player is. Each key is a status.
|
||||
-- Each value is a threshold for the minimum fed points (half-icons) for that
|
||||
-- status. The highest threshold has precedence. Behavior is undefined if the
|
||||
-- same threshold is used for multiple status keys. The special status 'none'
|
||||
-- is used when no others apply.
|
||||
--
|
||||
-- defaults:
|
||||
-- fedStatuses = fedStatuses or {};
|
||||
-- fedStatuses.starving = 0;
|
||||
-- fedStatuses.hungry = 1;
|
||||
-- fedStatuses.full = 10;
|
||||
--
|
||||
fedStatuses = fedStatuses or {};
|
||||
fedStatuses.starving = 0;
|
||||
fedStatuses.hungry = 1;
|
||||
fedStatuses.full = 10;
|
||||
|
||||
-- Status values indicating how well hydrated the player is. Each key is a
|
||||
-- status. Each value is a threshold for the minimum hydrated points
|
||||
-- (half-icons) for that status. The highest threshold has precedence.
|
||||
-- Behavior is undefined if the same threshold is used for multiple status
|
||||
-- keys. The special status 'none' is used when no others apply.
|
||||
--
|
||||
-- defaults:
|
||||
-- hydratedStatuses = hydratedStatuses or {};
|
||||
-- hydratedStatuses.dehydrated = 0;
|
||||
-- hydratedStatuses.thirsty = 1;
|
||||
-- hydratedStatuses.hydrated = 10;
|
||||
--
|
||||
hydratedStatuses = hydratedStatuses or {};
|
||||
hydratedStatuses.dehydrated = 0;
|
||||
hydratedStatuses.thirsty = 1;
|
||||
hydratedStatuses.hydrated = 10;
|
||||
|
||||
-- Status values indicating how badly poisoned the player is. Each key is a
|
||||
-- status. Each value is a threshold for the minimum hydrated points
|
||||
-- (half-icons) for that status. The highest threshold has precedence.
|
||||
-- Behavior is undefined if the same threshold is used for multiple status
|
||||
-- keys. The special status 'none' is used when no others apply.
|
||||
--
|
||||
-- defaults:
|
||||
-- poisonedStatuses = poisonedStatuses or {};
|
||||
-- poisonedStatuses.poisoned = 1;
|
||||
--
|
||||
poisonedStatuses = poisonedStatuses or {};
|
||||
poisonedStatuses.poisoned = 1;
|
||||
|
||||
|
||||
--- Exertion Status Conditions
|
||||
|
||||
-- Control keys (from Player:get_player_control()) that indicates the player is
|
||||
-- engaging in strenuous movement. Any time these controls are detected
|
||||
-- (and/or the player is holding his/her breath), it contributes to the
|
||||
-- activity ratio.
|
||||
--
|
||||
-- default: exertionControls = { 'up', 'down', 'left', 'right', 'jump' };
|
||||
--
|
||||
exertionControls = { 'up', 'down', 'left', 'right', 'jump' };
|
||||
|
||||
-- Breath (from Player:get_breath()) max (inclusive) threshold that indicates
|
||||
-- the player is straining to hold his/her breath. Any time the player's
|
||||
-- breath is less than or equal to this (or the player is moving), it
|
||||
-- contributes to the activity ratio.
|
||||
--
|
||||
-- default: exertionBreathMax = 10;
|
||||
--
|
||||
exertionHoldingBreathMax = 10;
|
||||
|
||||
|
||||
--- Status Effects
|
||||
|
||||
-- Rate multipliers for amount of food decrease per period for each status
|
||||
-- (exertion, fed, hydrated, poisoned). Each multiplier defaults to 1.0 if the
|
||||
-- applicable status is not present.
|
||||
--
|
||||
-- defaults:
|
||||
-- foodMultipliers = foodMultipliers or
|
||||
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
-- foodMultipliers.exertion.none = 1.0;
|
||||
-- foodMultipliers.exertion.light = 2.0;
|
||||
-- foodMultipliers.exertion.heavy = 3.0;
|
||||
--
|
||||
foodMultipliers = foodMultipliers or
|
||||
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
foodMultipliers.exertion.none = 1.0;
|
||||
foodMultipliers.exertion.light = 2.0;
|
||||
foodMultipliers.exertion.heavy = 3.0;
|
||||
|
||||
-- Rate multipliers for amount of food decrease per period for each status
|
||||
-- (exertion, fed, hydrated, poisoned). Each multiplier defaults to 1.0 if the
|
||||
-- applicable status is not present.
|
||||
--
|
||||
-- defaults:
|
||||
-- waterMultipliers = waterMultipliers or
|
||||
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
-- waterMultipliers.exertion.none = 1.0;
|
||||
-- waterMultipliers.exertion.light = 2.0;
|
||||
-- waterMultipliers.exertion.heavy = 3.0;
|
||||
--
|
||||
waterMultipliers = waterMultipliers or
|
||||
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
waterMultipliers.exertion.none = 1.0;
|
||||
waterMultipliers.exertion.light = 2.0;
|
||||
waterMultipliers.exertion.heavy = 3.0;
|
||||
|
||||
-- Rate multipliers for healing per period for each status (exertion, fed,
|
||||
-- hydrated, poisoned). Each multiplier defaults to 1.0 if the applicable
|
||||
-- status is not present.
|
||||
--
|
||||
-- defaults:
|
||||
-- healingMultipliers = healingMultipliers or
|
||||
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
-- healingMultipliers.exertion.none = 1.0;
|
||||
-- healingMultipliers.exertion.light = 1.0;
|
||||
-- healingMultipliers.exertion.heavy = 0.5;
|
||||
-- healingMultipliers.fed.starving = 0.0;
|
||||
-- healingMultipliers.fed.hungry = 0.0;
|
||||
-- healingMultipliers.fed.full = 1.0;
|
||||
-- healingMultipliers.hydrated.dehydrated = 0.0;
|
||||
-- healingMultipliers.hydrated.thirsty = 0.0;
|
||||
-- healingMultipliers.hydrated.hydrated = 1.0;
|
||||
-- healingMultipliers.poisoned.none = 1.0;
|
||||
-- healingMultipliers.poisoned.poisoned = 0.0;
|
||||
--
|
||||
healingMultipliers = healingMultipliers or
|
||||
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
healingMultipliers.exertion.none = 1.0;
|
||||
healingMultipliers.exertion.light = 1.0;
|
||||
healingMultipliers.exertion.heavy = 0.5;
|
||||
healingMultipliers.fed.starving = 0.0;
|
||||
healingMultipliers.fed.hungry = 0.0;
|
||||
healingMultipliers.fed.full = 1.0;
|
||||
healingMultipliers.hydrated.dehydrated = 0.0;
|
||||
healingMultipliers.hydrated.thirsty = 0.0;
|
||||
healingMultipliers.hydrated.hydrated = 1.0;
|
||||
healingMultipliers.poisoned.none = 1.0;
|
||||
healingMultipliers.poisoned.poisoned = 0.0;
|
||||
|
||||
-- Multipliers for running speed per period for each status (exertion, fed,
|
||||
-- hydrated, poisoned). Each multiplier defaults to 1.0 if the applicable
|
||||
-- status is not present.
|
||||
--
|
||||
-- defaults:
|
||||
-- speedMultipliers = speedMultipliers or
|
||||
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
-- speedMultipliers.fed.starving = 0.8;
|
||||
-- speedMultipliers.fed.hungry = 1.0;
|
||||
-- speedMultipliers.fed.full = 1.0;
|
||||
-- speedMultipliers.hydrated.dehydrated = 0.8;
|
||||
-- speedMultipliers.hydrated.thirsty = 1.0;
|
||||
-- speedMultipliers.hydrated.hydrated = 1.0;
|
||||
-- speedMultipliers.poisoned.none = 1.0;
|
||||
-- speedMultipliers.poisoned.poisoned = 0.8;
|
||||
--
|
||||
speedMultipliers = speedMultipliers or
|
||||
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
speedMultipliers.fed.starving = 0.8;
|
||||
speedMultipliers.fed.hungry = 1.0;
|
||||
speedMultipliers.fed.full = 1.0;
|
||||
speedMultipliers.hydrated.dehydrated = 0.8;
|
||||
speedMultipliers.hydrated.thirsty = 1.0;
|
||||
speedMultipliers.hydrated.hydrated = 1.0;
|
||||
speedMultipliers.poisoned.none = 1.0;
|
||||
speedMultipliers.poisoned.poisoned = 0.8;
|
||||
|
||||
-- Multipliers for jumping per period for each status (exertion, fed, hydrated,
|
||||
-- poisoned). Each multiplier defaults to 1.0 if the applicable status is not
|
||||
-- present.
|
||||
--
|
||||
-- defaults:
|
||||
-- jumpMultipliers = jumpMultipliers or
|
||||
-- { exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
-- jumpMultipliers.fed.starving = 0.8;
|
||||
-- jumpMultipliers.fed.hungry = 1.0;
|
||||
-- jumpMultipliers.fed.full = 1.0;
|
||||
-- jumpMultipliers.hydrated.dehydrated = 0.8;
|
||||
-- jumpMultipliers.hydrated.thirsty = 1.0;
|
||||
-- jumpMultipliers.hydrated.hydrated = 1.0;
|
||||
-- jumpMultipliers.poisoned.none = 1.0;
|
||||
-- jumpMultipliers.poisoned.poisoned = 0.8;
|
||||
--
|
||||
jumpMultipliers = jumpMultipliers or
|
||||
{ exertion = {}, fed = {}, hydrated = {}, poisoned = {} };
|
||||
jumpMultipliers.fed.starving = 0.8;
|
||||
jumpMultipliers.fed.hungry = 1.0;
|
||||
jumpMultipliers.fed.full = 1.0;
|
||||
jumpMultipliers.hydrated.dehydrated = 0.8;
|
||||
jumpMultipliers.hydrated.thirsty = 1.0;
|
||||
jumpMultipliers.hydrated.hydrated = 1.0;
|
||||
jumpMultipliers.poisoned.none = 1.0;
|
||||
jumpMultipliers.poisoned.poisoned = 0.8;
|
||||
|
||||
-- Probabilities of retching each accounting period for each poisoned status.
|
||||
--
|
||||
-- default:
|
||||
-- poisonedRetchProbabilities_perPeriod =
|
||||
-- poisonedRetchProbabilities_perPeriod or {};
|
||||
-- poisonedRetchProbabilities_perPeriod.none = 0.0;
|
||||
-- poisonedRetchProbabilities_perPeriod.poisoned = 0.25;
|
||||
--
|
||||
poisonedRetchProbabilities_perPeriod =
|
||||
poisonedRetchProbabilities_perPeriod or {};
|
||||
poisonedRetchProbabilities_perPeriod.none = 0.0;
|
||||
poisonedRetchProbabilities_perPeriod.poisoned = 0.25;
|
||||
|
||||
-- Amount of food loss when retching, in points (half-icons).
|
||||
-- default: retchingFoodLoss = 2.0;
|
||||
retchingFoodLoss = 2.0;
|
||||
|
||||
-- Amount of food loss when retching, in points (half-icons).
|
||||
-- default: retchingWaterLoss = 4.0;
|
||||
retchingWaterLoss = 4.0;
|
||||
|
||||
-- Damage taken when retching, in HP (half-icons).
|
||||
-- default: retchingDamage = 0.1;
|
||||
retchingDamage = 0.1;
|
||||
|
||||
-- Amount of air lost when holding breath and retching, in bubbles
|
||||
-- (half-icons).
|
||||
-- default: retchingAirLoss = 10.0;
|
||||
retchingAirLoss = 10.0;
|
||||
|
||||
|
||||
--- User Interface
|
||||
|
||||
-- Fed HUD bar definition.
|
||||
--
|
||||
-- default:
|
||||
-- fedHud = fedHud or { number = 0 };
|
||||
-- fedHud.hud_elem_type = 'statbar';
|
||||
-- fedHud.position = { x = 0.0, y = 1.0 };
|
||||
-- fedHud.text = "exertion_toastIcon_24x24.png";
|
||||
-- fedHud.direction = 3;
|
||||
-- fedHud.size = { x = 24, y = 24 };
|
||||
-- fedHud.offset = { x = 2, y = -26 };
|
||||
--
|
||||
fedHud = fedHud or { number = 0 };
|
||||
fedHud.hud_elem_type = 'statbar';
|
||||
fedHud.position = { x = 0.0, y = 1.0 };
|
||||
fedHud.text = "exertion_toastIcon_24x24.png";
|
||||
fedHud.direction = 3;
|
||||
fedHud.size = { x = 24, y = 24 };
|
||||
fedHud.offset = { x = 2, y = -26 };
|
||||
|
||||
-- Hydrated HUD bar definition.
|
||||
--
|
||||
-- default:
|
||||
-- hydratedHud = hydratedHud or { number = 0 };
|
||||
-- hydratedHud.hud_elem_type = 'statbar';
|
||||
-- hydratedHud.position = { x = 0.0, y = 1.0 };
|
||||
-- hydratedHud.text = "exertion_waterIcon_24x24.png";
|
||||
-- hydratedHud.direction = 3;
|
||||
-- hydratedHud.size = { x = 24, y = 24 };
|
||||
-- hydratedHud.offset = { x = 28, y = -26 };
|
||||
--
|
||||
hydratedHud = hydratedHud or { number = 0 };
|
||||
hydratedHud.hud_elem_type = 'statbar';
|
||||
hydratedHud.position = { x = 0.0, y = 1.0 };
|
||||
hydratedHud.text = "exertion_waterIcon_24x24.png";
|
||||
hydratedHud.direction = 3;
|
||||
hydratedHud.size = { x = 24, y = 24 };
|
||||
hydratedHud.offset = { x = 28, y = -26 };
|
||||
|
||||
-- Poisoned HUD bar definition.
|
||||
--
|
||||
-- default:
|
||||
-- poisonedHud = poisonedHud or { number = 0 };
|
||||
-- poisonedHud.hud_elem_type = 'statbar';
|
||||
-- poisonedHud.position = { x = 0.0, y = 1.0 };
|
||||
-- poisonedHud.text = "exertion_spiderIcon_24x24.png";
|
||||
-- poisonedHud.direction = 3;
|
||||
-- poisonedHud.size = { x = 24, y = 24 };
|
||||
-- poisonedHud.offset = { x = 54, y = -26 };
|
||||
--
|
||||
poisonedHud = poisonedHud or { number = 0 };
|
||||
poisonedHud.hud_elem_type = 'statbar';
|
||||
poisonedHud.position = { x = 0.0, y = 1.0 };
|
||||
poisonedHud.text = "exertion_spiderIcon_24x24.png";
|
||||
poisonedHud.direction = 3;
|
||||
poisonedHud.size = { x = 24, y = 24 };
|
||||
poisonedHud.offset = { x = 54, y = -26 };
|
||||
|
||||
-- Sound played when retching.
|
||||
--
|
||||
-- default: retchingSound = "exertion_doubleRetching.ogg";
|
||||
--
|
||||
retchingSound = "exertion_doubleRetching.ogg";
|
|
@ -0,0 +1,112 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="spiderIcon.svg">
|
||||
<defs
|
||||
id="defs4" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="50.75"
|
||||
inkscape:cx="8"
|
||||
inkscape:cy="8"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:snap-global="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="990"
|
||||
inkscape:window-x="-2"
|
||||
inkscape:window-y="32"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4136"
|
||||
empspacing="4" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1036.3622)">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.5;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="M 2.5292969 -0.005859375 C 1.4361524 -0.028859375 0.66187592 1.2148469 1.1660156 2.1855469 L 1.6015625 3.0566406 C 1.5374345 3.0466406 1.4865731 2.981375 1.4238281 2.984375 C 1.0167522 3.005375 0.67953852 3.1837406 0.43164062 3.4316406 C 0.18374275 3.6795406 0.00497071 4.0167281 -0.015625 4.4238281 C -0.03622071 4.8308281 0.15035899 5.2841719 0.45507812 5.5761719 L 2.6894531 7.8125 L 3.2558594 8.0019531 L 2.9257812 8.1113281 L 0.86914062 9.1386719 C 0.47911968 9.3127719 0.14786525 9.6844312 0.033203125 10.082031 C -0.081458985 10.479531 -0.018974425 10.861034 0.13867188 11.177734 C 0.29631817 11.494334 0.56291554 11.773775 0.94921875 11.921875 C 1.3222927 12.064975 1.7930685 12.015172 2.1621094 11.826172 L 1.1601562 13.826172 C 0.9713537 14.199072 0.94486792 14.678434 1.09375 15.052734 C 1.2426319 15.426934 1.516822 15.690103 1.828125 15.845703 C 2.139428 16.001403 2.5136042 16.062531 2.9023438 15.957031 C 3.2910831 15.851531 3.658767 15.542769 3.84375 15.167969 L 4.4804688 13.892578 A 4 4 0 0 0 8 16 A 4 4 0 0 0 11.521484 13.894531 L 12.15625 15.167969 C 12.34127 15.542669 12.708951 15.851531 13.097656 15.957031 C 13.486361 16.062431 13.860592 16.001103 14.171875 15.845703 C 14.483158 15.690103 14.757363 15.426934 14.90625 15.052734 C 15.055137 14.678434 15.028581 14.199072 14.839844 13.826172 L 13.837891 11.826172 C 14.206932 12.014472 14.677706 12.064675 15.050781 11.921875 C 15.437086 11.773775 15.703682 11.494334 15.861328 11.177734 C 16.018975 10.861034 16.08146 10.479531 15.966797 10.082031 C 15.852134 9.6844312 15.520882 9.3127719 15.130859 9.1386719 L 13.074219 8.1113281 L 12.744141 8.0019531 L 13.310547 7.8125 L 15.544922 5.5761719 C 15.849628 5.2841719 16.036225 4.8308281 16.015625 4.4238281 C 15.995025 4.0167281 15.816255 3.6795406 15.568359 3.4316406 C 15.320464 3.1837406 14.98324 3.004975 14.576172 2.984375 C 14.513432 2.984375 14.462565 3.0506406 14.398438 3.0566406 L 14.839844 2.1757812 C 15.028577 1.8028812 15.055133 1.3235187 14.90625 0.94921875 C 14.757363 0.57501875 14.483158 0.31185 14.171875 0.15625 C 13.860592 0.00065 13.486361 -0.060478125 13.097656 0.044921875 C 12.708951 0.15042187 12.34127 0.45928437 12.15625 0.83398438 L 11.267578 2.6132812 L 10.585938 3.2929688 C 10.584418 3.2335193 10.599191 3.1798879 10.59375 3.1191406 C 10.54852 2.6140406 10.33391 2.0419 9.8652344 1.625 C 9.396559 1.2081 8.7358627 1 8 1 C 7.2641372 1 6.6053942 1.2081 6.1367188 1.625 C 5.6680433 2.0419 5.4514778 2.6140406 5.40625 3.1191406 C 5.4008094 3.1798879 5.415582 3.2335193 5.4140625 3.2929688 L 4.7324219 2.6132812 L 3.8476562 0.84375 C 3.6041866 0.33745 3.0927637 0.007340625 2.53125 -0.005859375 L 2.5292969 -0.005859375 z "
|
||||
transform="translate(0,1036.3622)"
|
||||
id="path4323" />
|
||||
<path
|
||||
id="path4177"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#00ff00;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 14.5,1046.8622 -2,-1 -4.5,-1.5 m 6.5,-3.5 -2,2 -4.5,1.5 m 5.5,6.5 -1,-2 -4.5,-4.5 m 5.5,-6.5 -1,2 -4.5,4.5 m -6.5,2.5 2,-1 4.5,-1.5 m -6.5,-3.5 2,2 4.5,1.5 m -5.5,6.5 1,-2 4.5,-4.5 m -5.5,-6.5 1,2 4.5,4.5" />
|
||||
<circle
|
||||
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="path4147"
|
||||
cx="8"
|
||||
cy="1044.3622"
|
||||
r="2" />
|
||||
<g
|
||||
id="g4338">
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4153"
|
||||
d="m 8,1038.3622 c -1.2288301,0.739 -0.8053557,1.5281 -0.4408867,1.803 l -0.5726601,0.8152 C 6.322151,1040.7104 5.7536947,1038.4016 8,1038.3622 Z"
|
||||
style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<circle
|
||||
r="1.5"
|
||||
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="circle4149"
|
||||
cx="8"
|
||||
cy="1041.3622" />
|
||||
<circle
|
||||
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="circle4151"
|
||||
cx="8"
|
||||
cy="1048.3622"
|
||||
r="3" />
|
||||
<path
|
||||
style="fill:#00ff00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 8,1038.3622 c 1.2288301,0.739 0.8053557,1.5281 0.4408867,1.803 l 0.5726601,0.8152 C 9.677849,1040.7104 10.246305,1038.4016 8,1038.3622 Z"
|
||||
id="path4273"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<circle
|
||||
style="opacity:1;fill:#00ff00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="circle4317"
|
||||
cx="8"
|
||||
cy="1044.3622"
|
||||
r="2" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 7.8 KiB |
|
@ -0,0 +1,103 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="toastIcon.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter4162"
|
||||
inkscape:label="grain">
|
||||
<feTurbulence
|
||||
id="feTurbulence4164"
|
||||
baseFrequency="0.5"
|
||||
result="result1"
|
||||
numOctaves="2" />
|
||||
<feColorMatrix
|
||||
id="feColorMatrix4182"
|
||||
values="0.5 0.5 0 0 0 0.5 0.5 0 0 0 0.5 0.5 0 0 0 0 0 0 0 1 "
|
||||
result="result2" />
|
||||
<feComposite
|
||||
id="feComposite4190"
|
||||
operator="arithmetic"
|
||||
k1="0"
|
||||
k2="0.25"
|
||||
k3="1"
|
||||
in2="SourceGraphic"
|
||||
k4="0" />
|
||||
<feComposite
|
||||
id="feComposite4188"
|
||||
in2="SourceAlpha"
|
||||
operator="in"
|
||||
result="result3" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="35.885669"
|
||||
inkscape:cx="12.046646"
|
||||
inkscape:cy="5.1233435"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="990"
|
||||
inkscape:window-x="-2"
|
||||
inkscape:window-y="32"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4136"
|
||||
empspacing="4" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1036.3622)">
|
||||
<path
|
||||
id="path4140"
|
||||
style="opacity:1;fill:#c39f22;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4162)"
|
||||
d="m 12.5,1049.8622 0,-7 c 1.5,0 3.5,-4 -4.5,-4 -8,0 -6,4 -4.5,4 l 0,7 z"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cczccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cczccc"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 3.5,1049.8622 0,-7 c -1.5,0 -3.5,-4 4.5,-4 8,0 6,4 4.5,4 l 0,7 z"
|
||||
style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#5b4627;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path4166" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.1 KiB |
|
@ -0,0 +1,100 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="waterIcon.svg">
|
||||
<defs
|
||||
id="defs4" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="35.885669"
|
||||
inkscape:cx="10.484131"
|
||||
inkscape:cy="7.1142886"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
units="px"
|
||||
inkscape:snap-global="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="990"
|
||||
inkscape:window-x="-2"
|
||||
inkscape:window-y="32"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4136"
|
||||
empspacing="4" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-1036.3622)">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:0.25;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="M 8.0078125 0 C 6.8978249 0 6.0233599 0.23235625 5.3710938 0.66015625 C 4.7188275 1.0876563 4.2514137 1.7888687 4.2539062 2.6054688 C 4.2561487 3.3409704 4.6453151 3.9686704 5.1972656 4.4003906 C 4.9503089 4.411159 4.7049169 4.4229795 4.515625 4.4667969 C 4.078049 4.5681969 3.693695 4.7594 3.4375 5.0625 C 2.92511 5.6689 3.0039063 6.3768 3.0039062 7.25 L 3.0039062 13.664062 C 3.0039062 14.118363 3.0029125 14.461778 3.0390625 14.767578 C 3.0752725 15.073578 3.1586916 15.395725 3.4316406 15.640625 C 3.7045926 15.885425 4.0456264 15.949763 4.3652344 15.976562 C 4.6848424 16.003563 5.0382891 15.998047 5.5019531 15.998047 L 10.498047 15.998047 C 10.961708 15.998047 11.317105 16.009562 11.636719 15.976562 C 11.956333 15.949562 12.295422 15.885725 12.568359 15.640625 C 12.841295 15.395725 12.926679 15.073578 12.962891 14.767578 C 12.999091 14.461778 12.996094 14.118362 12.996094 13.664062 L 12.996094 7.25 C 12.996094 6.3768 13.076837 5.6689 12.564453 5.0625 C 12.308258 4.7594 11.919998 4.5678969 11.482422 4.4667969 C 11.296142 4.423677 11.057367 4.4110754 10.814453 4.4003906 C 11.366833 3.9686704 11.759474 3.3409704 11.761719 2.6054688 C 11.764219 1.7888687 11.294844 1.0876563 10.642578 0.66015625 C 9.9903125 0.23245625 9.1178005 0 8.0078125 0 z "
|
||||
transform="translate(0,1036.3622)"
|
||||
id="path4180" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;opacity:0.25"
|
||||
d="m 8.0078125,1.5 c -2.4484074,0 -2.8967196,1.4546037 -1.3710937,2 L 6.5,3.5 l 0,2 c -2.029654,0 -2,0.4961 -2,2 l 0,5.5 c 0,1.557 0.00227,1.5 1.5,1.5 l 4,0 c 1.4977,0 1.5,0.0569 1.5,-1.5 l 0,-5.5 c 0,-1.5039 0.02965,-2 -2,-2 l 0,-2 -0.1210938,0 C 10.904532,2.9546037 10.45622,1.5 8.0078125,1.5 Z"
|
||||
id="path4147"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scccsssssscccs"
|
||||
transform="translate(0,1036.3622)" />
|
||||
<path
|
||||
id="path4167"
|
||||
style="fill:#00ffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="m 9.9974158,1050.8622 c 1.4977302,0 1.5000002,0.057 1.5000002,-1.5 l 0,-5.5 c -2.3948142,0.2992 -4.8176859,0.3278 -7.0009762,0 l 0,5.5 c 0,1.557 0.00227,1.5 1.5,1.5 z"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csccscc" />
|
||||
<path
|
||||
id="path4170"
|
||||
style="fill:#00ff19;fill-opacity:1;fill-rule:evenodd;stroke:#2500ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="m 11.497416,1043.8622 c -2.3948142,0.2992 -4.8176859,0.3278 -7.0009762,0"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccssccsscc"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 9.5,1039.8622 0,2 c 2.029654,0 2,0.4961 2,2 l 0,5.5 c 0,1.5569 -0.0023,1.5 -1.5,1.5 l -4,0 c -1.49773,0 -1.5,0.057 -1.5,-1.5 l 0,-5.5 c 0,-1.5039 -0.029654,-2 2,-2 l 0,-2"
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#c8ffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path4165" />
|
||||
<path
|
||||
sodipodi:nodetypes="zzz"
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 8.0071064,1037.8622 c -3.0134245,0 -2.997398,2.2031 0,2.2031 2.9973976,0 3.0134246,-2.2031 0,-2.2031 z"
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#c8ffff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path4177" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.2 KiB |
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 594 B |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 906 B |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 361 B |
After Width: | Height: | Size: 705 B |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 507 B |
After Width: | Height: | Size: 782 B |
After Width: | Height: | Size: 7.4 KiB |
After Width: | Height: | Size: 1012 B |
After Width: | Height: | Size: 1.9 KiB |