mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-08-01 03:30:25 +00:00
refactored so user = {stats: {hp, lvl, exp, money}, items = {weapon,
armor, ..}, tasks, ...}
This commit is contained in:
parent
6761a7f89e
commit
3b4a3f27d4
4 changed files with 74 additions and 74 deletions
|
|
@ -114,7 +114,7 @@ module.exports = {
|
|||
}
|
||||
]
|
||||
|
||||
staticRewards: {
|
||||
items: {
|
||||
weapon: [
|
||||
{text: "Sword 1", icon: "item-sword1", notes:'', value:0}
|
||||
{text: "Sword 2", icon:'item-sword2', notes:'', value:100}
|
||||
|
|
|
|||
|
|
@ -4,53 +4,6 @@ derby.use require('derby-ui-boot')
|
|||
derby.use(require('../../ui'))
|
||||
content = require('./content')
|
||||
|
||||
## ROUTES ##
|
||||
|
||||
get '/', (page, model) ->
|
||||
# Render page if a userId is already stored in session data
|
||||
if userId = model.get '_session.userId'
|
||||
return getRoom page, model, userId
|
||||
|
||||
# Otherwise, select a new userId and initialize user
|
||||
model.async.incr 'configs.1.nextUserId', (err, userId) ->
|
||||
model.set '_session.userId', userId
|
||||
model.set "users.#{userId}",
|
||||
name: 'User ' + userId
|
||||
money: 0
|
||||
exp: 0
|
||||
lvl: 1
|
||||
hp: 50
|
||||
getRoom page, model, userId
|
||||
|
||||
getRoom = (page, model, userId) ->
|
||||
|
||||
model.subscribe "users.#{userId}", (err, user) ->
|
||||
model.ref '_user', user
|
||||
model.refList "_habitList", "_user.tasks", "_user.habitIds"
|
||||
model.refList "_dailyList", "_user.tasks", "_user.dailyIds"
|
||||
model.refList "_todoList", "_user.tasks", "_user.todoIds"
|
||||
model.refList "_rewardList", "_user.tasks", "_user.rewardIds"
|
||||
unless model.get('_user.tasks')
|
||||
model.push '_habitList', task for task in content.defaultTasks.habits
|
||||
model.push '_dailyList', task for task in content.defaultTasks.dailys
|
||||
model.push '_todoList', task for task in content.defaultTasks.todos
|
||||
model.push '_rewardList', task for task in content.defaultTasks.rewards
|
||||
|
||||
#static rewards
|
||||
model.setNull('_user.inventory', {armor:0, weapon:0})
|
||||
sr = [
|
||||
content.staticRewards.armor[user.get('inventory.armor')+1]
|
||||
content.staticRewards.weapon[user.get('inventory.weapon')+1]
|
||||
content.staticRewards.potion
|
||||
content.staticRewards.reroll
|
||||
]
|
||||
model.set '_staticRewards', sr
|
||||
|
||||
# http://tibia.wikia.com/wiki/Formula
|
||||
model.fn '_tnl', '_user.lvl', (lvl) -> 50 * Math.pow(lvl, 2) - 150 * lvl + 200
|
||||
|
||||
page.render()
|
||||
|
||||
## VIEW HELPERS ##
|
||||
view.fn 'taskClasses', (type, completed, value, hideCompleted) ->
|
||||
#TODO figure out how to just pass in the task model, so i can access all these properties from one object
|
||||
|
|
@ -81,6 +34,52 @@ view.fn "gold", (num) ->
|
|||
|
||||
view.fn "silver", (num) ->
|
||||
num.toFixed(1).split('.')[1] if num
|
||||
|
||||
## ROUTES ##
|
||||
|
||||
get '/', (page, model) ->
|
||||
# Render page if a userId is already stored in session data
|
||||
if userId = model.get '_session.userId'
|
||||
return getRoom page, model, userId
|
||||
|
||||
# Otherwise, select a new userId and initialize user
|
||||
model.async.incr 'configs.1.nextUserId', (err, userId) ->
|
||||
model.set '_session.userId', userId
|
||||
model.set "users.#{userId}",
|
||||
name: 'User ' + userId
|
||||
getRoom page, model, userId
|
||||
|
||||
getRoom = (page, model, userId) ->
|
||||
|
||||
model.subscribe "users.#{userId}", (err, user) ->
|
||||
model.ref '_user', user
|
||||
|
||||
### Set User Defaults ###
|
||||
|
||||
# Default Items & Stats
|
||||
user.setNull 'stats', { money: 0, exp: 0, lvl: 1, hp: 50 }
|
||||
user.setNull 'items', { armor: 0, weapon: 0 }
|
||||
model.set '_items', [
|
||||
content.items.armor[user.get('items.armor')+1]
|
||||
content.items.weapon[user.get('items.weapon')+1]
|
||||
content.items.potion
|
||||
content.items.reroll
|
||||
]
|
||||
# http://tibia.wikia.com/wiki/Formula
|
||||
model.fn '_tnl', '_user.stats.lvl', (lvl) -> 50 * Math.pow(lvl, 2) - 150 * lvl + 200
|
||||
|
||||
# Default Tasks
|
||||
model.refList "_habitList", "_user.tasks", "_user.habitIds"
|
||||
model.refList "_dailyList", "_user.tasks", "_user.dailyIds"
|
||||
model.refList "_todoList", "_user.tasks", "_user.todoIds"
|
||||
model.refList "_rewardList", "_user.tasks", "_user.rewardIds"
|
||||
unless model.get('_user.tasks')
|
||||
model.push '_habitList', task for task in content.defaultTasks.habits
|
||||
model.push '_dailyList', task for task in content.defaultTasks.dailys
|
||||
model.push '_todoList', task for task in content.defaultTasks.todos
|
||||
model.push '_rewardList', task for task in content.defaultTasks.rewards
|
||||
|
||||
page.render()
|
||||
|
||||
## CONTROLLER FUNCTIONS ##
|
||||
|
||||
|
|
@ -105,10 +104,12 @@ ready (model) ->
|
|||
# Deduct experience for missed Daily tasks,
|
||||
# but not for Todos (just increase todo's value)
|
||||
if (type == 'daily')
|
||||
user.set('hp', user.get('hp') + value)
|
||||
if user.get('hp') < 0
|
||||
user.set('stats.hp', user.get('stats.hp') + value)
|
||||
if user.get('stats.hp') < 0
|
||||
#TODO this is implemented in exports.vote also, make it a user.on or something
|
||||
user.set('hp',50);user.set('lvl',1);user.set('exp',0)
|
||||
user.set('stats.hp',50)
|
||||
user.set('stats.lvl',1)
|
||||
user.set('stats.exp',0)
|
||||
if type == 'daily'
|
||||
task.push "history", { date: new Date(), value: value }
|
||||
else
|
||||
|
|
@ -118,9 +119,9 @@ ready (model) ->
|
|||
model.push '_user.history.todos', { date: new Date(), value: todoTally }
|
||||
|
||||
# tally experience
|
||||
expTally = user.get 'exp'
|
||||
expTally = user.get 'stats.exp'
|
||||
lvl = 0 #iterator
|
||||
_(user.get('lvl')-1).times ->
|
||||
_(user.get('stats.lvl')-1).times ->
|
||||
lvl++
|
||||
expTally += 50 * Math.pow(lvl, 2) - 150 * lvl + 200
|
||||
model.push '_user.history.exp', { date: new Date(), value: expTally }
|
||||
|
|
@ -295,7 +296,7 @@ ready (model) ->
|
|||
task.set('completed', completed)
|
||||
|
||||
# Update the user's status
|
||||
[money, hp, exp, lvl] = [user.get('money'), user.get('hp'), user.get('exp'), user.get('lvl')]
|
||||
[money, hp, exp, lvl] = [user.get('stats.money'), user.get('stats.hp'), user.get('stats.exp'), user.get('stats.lvl')]
|
||||
|
||||
if task.get('type') == 'reward'
|
||||
# purchase item
|
||||
|
|
@ -324,11 +325,10 @@ ready (model) ->
|
|||
if hp < 0
|
||||
[hp, lvl, exp] = [50, 1, 0]
|
||||
|
||||
user.set('money', money)
|
||||
user.set('hp', hp)
|
||||
user.set('exp', exp)
|
||||
user.set('lvl', lvl)
|
||||
#[user.money, user.hp, user.exp, user.lvl] = [money, hp, exp, lvl]
|
||||
user.set('stats.money', money)
|
||||
user.set('stats.hp', hp)
|
||||
user.set('stats.exp', exp)
|
||||
user.set('stats.lvl', lvl)
|
||||
|
||||
## SHORTCUTS ##
|
||||
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ footer.footer
|
|||
right: 10px
|
||||
|
||||
/* ----- Items, Weapons, Armor -----*/
|
||||
.static-reward .task-text img
|
||||
.item .task-text img
|
||||
max-height: 16px
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -11,22 +11,22 @@
|
|||
<table id="character">
|
||||
<tr>
|
||||
<td id="avatar">
|
||||
<img src="/img/avatar/{_user.lvl}.png" /><br/>
|
||||
<div id="lvl"><span class="badge badge-info">Lvl: {_user.lvl}</span></div>
|
||||
<img src="/img/avatar/{_user.stats.lvl}.png" /><br/>
|
||||
<div id="lvl"><span class="badge badge-info">Lvl: {_user.stats.lvl}</span></div>
|
||||
</td>
|
||||
<td id="bars">
|
||||
<div class="progress progress-danger">
|
||||
<span class="progress-text">HP: {round(_user.hp)} / 50</span>
|
||||
<div class="bar" style="width: {percent(_user.hp,50)}%;"></div>
|
||||
<span class="progress-text">HP: {round(_user.stats.hp)} / 50</span>
|
||||
<div class="bar" style="width: {percent(_user.stats.hp, 50)}%;"></div>
|
||||
</div>
|
||||
|
||||
<div class="progress progress-warning">
|
||||
{#if _user.history.exp}
|
||||
<span class="progress-text">
|
||||
<a x-bind=click:toggleChart data-chart-selector="exp-chart" data-history-path="_user.history.exp"><i class=icon-signal></i></a> Exp: {round(_user.exp)} / {_tnl}
|
||||
<a x-bind=click:toggleChart data-chart-selector="exp-chart" data-history-path="_user.history.exp"><i class=icon-signal></i></a> Exp: {round(_user.stats.exp)} / {_tnl}
|
||||
</span>
|
||||
{/}
|
||||
<div class="bar" style="width: {percent(_user.exp,_tnl)}%;"></div>
|
||||
<div class="bar" style="width: {percent(_user.stats.exp,_tnl)}%;"></div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -98,12 +98,12 @@
|
|||
</app:taskColumn>
|
||||
|
||||
<app:taskColumn title="Rewards" type="reward">
|
||||
<div id="money">{gold(_user.money)} <img src='/img/coin_single_gold.png'/> {silver(_user.money)} <img src='/img/coin_single_silver.png'/></div>
|
||||
<div id="money">{gold(_user.stats.money)} <img src='/img/coin_single_gold.png'/> {silver(_user.stats.money)} <img src='/img/coin_single_silver.png'/></div>
|
||||
<ul class='rewards'>
|
||||
{#each _rewardList as :task}<app:task />{/}
|
||||
</ul>
|
||||
<ul class='static-rewards'>
|
||||
{#each _staticRewards as :reward}<app:staticReward />{/}
|
||||
<ul class='items'>
|
||||
{#each _items as :item}<app:item />{/}
|
||||
</ul>
|
||||
<app:newTask type=reward><input value={_newReward} type="text" /></app:newTask>
|
||||
</app:taskColumn>
|
||||
|
|
@ -205,16 +205,16 @@
|
|||
|
||||
<div style="display:none;" id={{:task.id}}-chart></div>
|
||||
|
||||
<staticReward:>
|
||||
<li class="task reward static-reward">
|
||||
<item:>
|
||||
<li class="task reward item">
|
||||
<pre>
|
||||
<div class="task-meta-controls">
|
||||
<span data-placement="left" data-content="{:reward.notes}" data-original-title="{:reward.text}" class='task-notes'><i class="icon-comment"></i></span>
|
||||
<span data-placement="left" data-content="{:item.notes}" data-original-title="{:item.text}" class='task-notes'><i class="icon-comment"></i></span>
|
||||
</div>
|
||||
<div class="task-controls">
|
||||
<a x-bind=click:vote class="static-buy-link" data-direction=down>{:reward.value}<img src="img/coin_single_gold.png"/></a>
|
||||
<a x-bind=click:vote class="static-buy-link" data-direction=down>{:item.value}<img src="img/coin_single_gold.png"/></a>
|
||||
</div>
|
||||
<div class="task-text"><img src="/img/BrowserQuest/{:reward.icon}.png" /> {:reward.text}</div>
|
||||
<div class="task-text"><img src="/img/BrowserQuest/{:item.icon}.png" /> {:item.text}</div>
|
||||
</pre>
|
||||
</li>
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue