1+ /**
2+ * Engine/MapEngine/Trade.js
3+ *
4+ * Manage Trade packets
5+ * TODO: PACKET.CZ.REQ_EXCHANGE_ITEM
6+ *
7+ * This file is part of ROBrowser, Ragnarok Online in the Web Browser (http://www.robrowser.com/).
8+ *
9+ * @author Vincent Thibault
10+ */
11+ define ( function ( require )
12+ {
13+ 'use strict' ;
14+
15+
16+ /**
17+ * Load dependencies
18+ */
19+ var DB = require ( 'DB/DBManager' ) ;
20+ var Network = require ( 'Network/NetworkManager' ) ;
21+ var PACKET = require ( 'Network/PacketStructure' ) ;
22+ var Trade = require ( 'UI/Components/Trade/Trade' ) ;
23+ var ChatBox = require ( 'UI/Components/ChatBox/ChatBox' ) ;
24+ var UIManager = require ( 'UI/UIManager' ) ;
25+
26+
27+ /**
28+ * Convert GID to a random string
29+ * It's used in the official client
30+ *
31+ * @param {number } GID
32+ * @param {string } randrom string
33+ */
34+ function TradeGIDEncoding ( GID )
35+ {
36+ var table = 'ROHUTNASEW' ;
37+ var str , out ;
38+ var i , count ;
39+
40+ str = String ( GID ) ;
41+ out = '' ;
42+
43+ for ( i = 0 , count = str . length ; i < count ; ++ i ) {
44+ out += table [ str [ i ] ] ;
45+ }
46+
47+ return out ;
48+ }
49+
50+
51+ /**
52+ * Someone ask to start a trade
53+ * @param {object } pkt - PACKET.ZC.REQ_EXCHANGE_ITEM
54+ */
55+ function onTradeRequest ( pkt )
56+ {
57+ function answer ( value ) {
58+ return function ( ) {
59+ var pkt = new PACKET . CZ . ACK_EXCHANGE_ITEM ( ) ;
60+ pkt . result = value ;
61+ Network . sendPacket ( pkt ) ;
62+ } ;
63+ }
64+
65+ var text = '(' + pkt . name + ') ' + DB . getMessage ( 93 ) + ( 'level' in pkt ? '\n' + 'Lv. ' + pkt . level : '' ) ;
66+ Trade . title = pkt . name ;
67+
68+ if ( 'level' in pkt ) {
69+ Trade . title += ' Lv' + pkt . level ;
70+ }
71+
72+ if ( 'GID' in pkt ) {
73+ Trade . title += ' (' + TradeGIDEncoding ( pkt . GID ) + ')' ;
74+ }
75+
76+ UIManager . showPromptBox ( text , 'ok' , 'cancel' , answer ( 3 ) , answer ( 4 ) ) ;
77+ }
78+
79+
80+ /**
81+ * Result about trade ask
82+ * @param {object } pkt - PACKET.ZC.ACK_EXCHANGE_ITEM
83+ */
84+ function onTradeRequestAnswer ( pkt )
85+ {
86+ switch ( pkt . result ) {
87+ case 0 : // Char is too far
88+ ChatBox . addText ( DB . getMessage ( 70 ) , ChatBox . TYPE . ERROR ) ;
89+ break ;
90+
91+
92+ case 1 : // Character does not exist
93+ ChatBox . addText ( DB . getMessage ( 71 ) , ChatBox . TYPE . ERROR ) ;
94+ break ;
95+
96+ case 2 : // In another deal
97+ ChatBox . addText ( DB . getMessage ( 72 ) , ChatBox . TYPE . ERROR ) ;
98+ break ;
99+
100+ case 3 :
101+ Trade . append ( ) ;
102+ break ;
103+
104+ case 4 : // Cancel
105+ ChatBox . addText ( DB . getMessage ( 74 ) , ChatBox . TYPE . ERROR ) ;
106+ break ;
107+
108+ case 5 : // AFK ?
109+ break ;
110+ }
111+ }
112+
113+
114+ /**
115+ * Try to add an item to the list
116+ *
117+ * @param {number } item index in inventory
118+ * @param {number } count
119+ */
120+ Trade . reqAddItem = function reqAddItem ( index , count )
121+ {
122+ var pkt = new PACKET . CZ . ADD_EXCHANGE_ITEM ( ) ;
123+ pkt . index = index ;
124+ pkt . count = count ;
125+
126+ Network . sendPacket ( pkt ) ;
127+ } ;
128+
129+
130+ /**
131+ * Response from the server when requesting to add an item.
132+ *
133+ * @param {object } pkt - PACKET.ZC.ACK_ADD_EXCHANGE_ITEM
134+ */
135+ function onAddItemResult ( pkt )
136+ {
137+ switch ( pkt . result ) {
138+ case 1 : // overweight
139+ ChatBox . addText ( DB . getMessage ( 73 ) , ChatBox . TYPE . ERROR ) ;
140+ break ;
141+
142+ case 2 : // trade canceled
143+ ChatBox . addText ( DB . getMessage ( 74 ) , ChatBox . TYPE . ERROR ) ;
144+ break ;
145+ }
146+
147+ Trade . addItemFromInventory ( pkt . Index , pkt . result === 0 ) ;
148+ }
149+
150+
151+ /**
152+ * Oher user added another item
153+ *
154+ * @param {object } pkt - PACKET.ZC.ADD_EXCHANGE_ITEM
155+ */
156+ function onItemAdded ( pkt )
157+ {
158+ Trade . addItem ( pkt ) ;
159+ }
160+
161+
162+ /**
163+ * Reject deal
164+ */
165+ Trade . onCancel = function onCancel ( )
166+ {
167+ var pkt = new PACKET . CZ . CANCEL_EXCHANGE_ITEM ( ) ;
168+ Network . sendPacket ( pkt ) ;
169+ } ;
170+
171+
172+ /**
173+ * Deal canceled
174+ *
175+ * @param {object } pkt - PACKET.ZC.CANCEL_EXCHANGE_ITEM
176+ */
177+ function onTradeCancel ( pkt )
178+ {
179+ ChatBox . addText ( DB . getMessage ( 74 ) , ChatBox . TYPE . ERROR ) ;
180+ Trade . remove ( ) ;
181+ }
182+
183+
184+ /**
185+ * Conclude the deal
186+ */
187+ Trade . onConclude = function onConclude ( )
188+ {
189+ var pkt = new PACKET . CZ . CONCLUDE_EXCHANGE_ITEM ( ) ;
190+ Network . sendPacket ( pkt ) ;
191+ } ;
192+
193+
194+ /**
195+ * Conclude a part of the trade
196+ *
197+ * @param {object } pkt - PACKET.ZC.CONCLUDE_EXCHANGE_ITEM
198+ */
199+ function onTradeConclude ( pkt )
200+ {
201+ Trade . conclude ( pkt . who ? 'recv' : 'send' ) ;
202+ }
203+
204+
205+ /**
206+ * Submit the trade
207+ */
208+ Trade . onTradeSubmit = function onTradeSubmit ( )
209+ {
210+ var pkt = new PACKET . CZ . EXEC_EXCHANGE_ITEM ( ) ;
211+ Network . sendPacket ( pkt ) ;
212+ } ;
213+
214+
215+ /**
216+ * Result of the deal
217+ *
218+ * @param {object } pkt - PACKET.ZC.EXEC_EXCHANGE_ITEM
219+ */
220+ function onTradeSubmitAnswer ( pkt )
221+ {
222+ // Fail
223+ if ( pkt . result === 1 ) {
224+ ChatBox . addText ( DB . getMessage ( 76 ) , ChatBox . TYPE . ERROR ) ;
225+ Trade . remove ( ) ;
226+ return ;
227+ }
228+
229+ //TODO: Give items...
230+ ChatBox . addText ( DB . getMessage ( 75 ) , ChatBox . TYPE . BLUE ) ;
231+ Trade . remove ( ) ;
232+ }
233+
234+
235+ /**
236+ * Initialize
237+ */
238+ return function MainEngine ( )
239+ {
240+ Network . hookPacket ( PACKET . ZC . REQ_EXCHANGE_ITEM , onTradeRequest ) ;
241+ Network . hookPacket ( PACKET . ZC . REQ_EXCHANGE_ITEM2 , onTradeRequest ) ;
242+ Network . hookPacket ( PACKET . ZC . ACK_EXCHANGE_ITEM , onTradeRequestAnswer ) ;
243+ Network . hookPacket ( PACKET . ZC . ACK_EXCHANGE_ITEM2 , onTradeRequestAnswer ) ;
244+ Network . hookPacket ( PACKET . ZC . ACK_ADD_EXCHANGE_ITEM , onAddItemResult ) ;
245+ Network . hookPacket ( PACKET . ZC . ADD_EXCHANGE_ITEM , onItemAdded ) ;
246+ Network . hookPacket ( PACKET . ZC . ADD_EXCHANGE_ITEM2 , onItemAdded ) ;
247+ Network . hookPacket ( PACKET . ZC . CANCEL_EXCHANGE_ITEM , onTradeCancel ) ;
248+ Network . hookPacket ( PACKET . ZC . CONCLUDE_EXCHANGE_ITEM , onTradeConclude ) ;
249+ Network . hookPacket ( PACKET . ZC . EXEC_EXCHANGE_ITEM , onTradeSubmitAnswer ) ;
250+ } ;
251+ } ) ;
0 commit comments