summaryrefslogtreecommitdiff
path: root/status.py
diff options
context:
space:
mode:
Diffstat (limited to 'status.py')
-rw-r--r--status.py179
1 files changed, 179 insertions, 0 deletions
diff --git a/status.py b/status.py
new file mode 100644
index 0000000..6b497a3
--- /dev/null
+++ b/status.py
@@ -0,0 +1,179 @@
+from collections import OrderedDict
+import net.mapserv as mapserv
+import net.stats as st
+import itemdb
+from utils import encode_str
+import mapnames
+
+
+def stats_repr(*stat_types):
+ ps = mapserv.player_stats
+ sd = OrderedDict()
+
+ if 'stats' in stat_types:
+ sd['stats'] = 'STR:{} AGI:{} VIT:{} INT:{} DEX:{} LUK:{}'.format(
+ ps[st.STR], ps[st.AGI], ps[st.VIT], ps[st.INT],
+ ps[st.DEX], ps[st.LUK])
+
+ if 'hpmp' in stat_types:
+ sd['hpmp'] = 'HP:{}/{} MP:{}/{}'.format(ps[st.HP], ps[st.MAX_HP],
+ ps[st.MP], ps[st.MAX_MP])
+
+ if 'weight' in stat_types:
+ sd['weight'] = 'WG: {}/{}'.format(ps[st.TOTAL_WEIGHT],
+ ps[st.MAX_WEIGHT])
+
+ if 'points' in stat_types:
+ sd['points'] = 'LVL: {} EXP:{}/{} CP:{} SP:{}'.format(
+ ps[st.LEVEL], ps[st.EXP], ps[st.EXP_NEEDED],
+ ps[st.CHAR_POINTS], ps[st.SKILL_POINTS])
+
+ if 'zeny' in stat_types:
+ sd['zeny'] = 'GP:{}'.format(ps[st.MONEY])
+
+ if 'attack' in stat_types:
+ sd['attack'] = 'ATK:{} DEF:{} MATK:{} MDEF:{}'.format(
+ ps[st.ATK], ps[st.DEF], ps[st.MATK], ps[st.MDEF])
+
+ if 'skills' in stat_types:
+ sl = []
+ ps = mapserv.player_skills
+ skill_names = {339: 'focusing', 45: 'mallard', 350: 'brawling',
+ 352: 'speed', 353: 'resist', 354: 'astral',
+ 355: 'raging', 340: 'magic', 341: 'life',
+ 342: 'war', 343: 'transmut', 344: 'nature',
+ 345: 'astralm'}
+
+ for s_id, s_v in ps.items():
+ if s_v > 0:
+ sl.append('{}:{}'.format(skill_names.get(s_id,
+ str(s_id)), s_v))
+
+ sd['skills'] = ' '.join(sl)
+
+ return sd
+
+
+def invlists(max_items=1000):
+ inventory = OrderedDict()
+
+ for id_, amount in mapserv.player_inventory.values():
+ inventory[id_] = inventory.setdefault(id_, 0) + amount
+
+ lists = []
+ data = '\302\202B1'
+ i = 0
+ for id_, amount in inventory.items():
+ i += 1
+ if i > max_items:
+ i = 0
+ lists.append(data)
+ data = '\302\202B1'
+ data += encode_str(id_, 2)
+ data += encode_str(1, 4)
+ data += encode_str(amount, 3)
+
+ lists.append(data)
+ return lists
+
+
+def invlists2(max_length=255, source='inventory'):
+ inventory = OrderedDict()
+
+ if source == 'inventory':
+ source = mapserv.player_inventory
+ elif source == 'storage':
+ source = mapserv.player_storage
+ else:
+ return []
+
+ for id_, amount in source.values():
+ inventory[id_] = inventory.setdefault(id_, 0) + amount
+
+ lists = []
+ data = ''
+ for id_, amount in inventory.items():
+ s = itemdb.item_name(id_, True) + ', '
+ if amount > 1:
+ s = str(amount) + ' ' + s
+ if len(data + s) > max_length:
+ lists.append(data)
+ data = ''
+ data += s
+
+ lists.append(data[:-2])
+ return lists
+
+
+def player_position():
+ pp = mapserv.player_pos
+ map_name = mapnames.map_names.get(pp['map'], 'Unknown')
+ s = "Map: {} ({}), coor: {}, {}".format(
+ map_name, pp['map'], pp['x'], pp['y'])
+ return s
+
+
+def split_names(names, origin=[''], maxlen=255, separator=', '):
+ origin = origin[:]
+ if len(origin) < 1:
+ origin = ['']
+
+ for n in names:
+ ns = n + separator
+ if len(origin[-1] + ns) > maxlen:
+ origin.append(ns)
+ else:
+ origin[-1] += ns
+
+ origin[-1] = origin[-1][:-len(separator)]
+
+ return origin
+
+
+def nearby(btype=''):
+ nearby_beings = {'player': {}, 'npc': {}, 'monster': {}, 'portal': []}
+ for being in mapserv.beings_cache.itervalues():
+ if btype and being.type != btype:
+ continue
+
+ if being.type == 'portal':
+ nearby_beings['portal'].append((being.x, being.y))
+ continue
+
+ if being.type == 'npc' and len(being.name) < 1:
+ nearby_beings[being.type][str(being.job)] = 1
+ elif being.name in nearby_beings[being.type]:
+ nearby_beings[being.type][being.name] += 1
+ else:
+ nearby_beings[being.type][being.name] = 1
+
+ del_types = []
+ for t in nearby_beings:
+ if not nearby_beings[t]:
+ del_types.append(t)
+ for t in del_types:
+ del nearby_beings[t]
+
+ lines = []
+ for bt in ('monster', 'player', 'npc'):
+ if bt not in nearby_beings:
+ continue
+ lines.append(bt + 's : ')
+ names_s = []
+ for bname in sorted(nearby_beings[bt].iterkeys()):
+ count = nearby_beings[bt][bname]
+ if count > 1:
+ names_s.append('{} ({})'.format(bname, count))
+ else:
+ names_s.append(bname)
+
+ lines = split_names(names_s, lines)
+
+ if 'portal' in nearby_beings:
+ lines.append('portals : ')
+ coor_s = []
+ for cx, cy in nearby_beings['portal']:
+ coor_s.append('({},{})'.format(cx, cy))
+ lines = split_names(coor_s, lines)
+
+ return lines