diff --git a/src/Makefile.am b/src/Makefile.am index 8503ebb56..1881f0a90 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -571,8 +571,14 @@ komodod_LDADD += \ $(LIBBITCOIN_CRYPTO) \ $(LIBVERUS_CRYPTO) \ $(LIBVERUS_PORTABLE_CRYPTO) \ - $(LIBZCASH_LIBS) \ - libcc.so -lncurses + $(LIBZCASH_LIBS) + +if TARGET_DARWIN +komodod_LDADD += libcc.dylib -lncurses +else +komodod_LDADD += libcc.so -lncurses +endif + if ENABLE_PROTON komodod_LDADD += $(LIBBITCOIN_PROTON) $(PROTON_LIBS) diff --git a/src/cc/CCassets.h b/src/cc/CCassets.h index 82fbcb961..af9ec5bd1 100644 --- a/src/cc/CCassets.h +++ b/src/cc/CCassets.h @@ -47,7 +47,7 @@ bool AssetCalcAmounts(struct CCcontract_info *cpAssets, int64_t &inputs, int64_t //int64_t GetAssetBalance(CPubKey pk,uint256 tokenid); // --> GetTokenBalance() int64_t AddAssetInputs(struct CCcontract_info *cp, CMutableTransaction &mtx, CPubKey pk, uint256 assetid, int64_t total, int32_t maxinputs); -UniValue AssetOrders(uint256 tokenid); +UniValue AssetOrders(uint256 tokenid, CPubKey pubkey, uint8_t additionalEvalCode); //UniValue AssetInfo(uint256 tokenid); //UniValue AssetList(); //std::string CreateAsset(int64_t txfee,int64_t assetsupply,std::string name,std::string description); diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index 62d57e71c..63c94d920 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -458,7 +458,7 @@ int64_t AssetValidateCCvin(struct CCcontract_info *cp,Eval* eval,char *origCCadd else if( GetAssetorigaddrs(cp, origCCaddr, origaddr, vinTx) == 0 ) return eval->Invalid("couldnt get origaddr for buyvin"); - fprintf(stderr,"AssetValidateCCvin() got %.8f to origaddr.(%s)\n", (double)vinTx.vout[tx.vin[vini].prevout.n].nValue/COIN,origaddr); + //fprintf(stderr,"AssetValidateCCvin() got %.8f to origaddr.(%s)\n", (double)vinTx.vout[tx.vin[vini].prevout.n].nValue/COIN,origaddr); if ( vinTx.vout[0].nValue == 0 ) return eval->Invalid("null value CCvin"); @@ -622,7 +622,7 @@ bool AssetCalcAmounts(struct CCcontract_info *cpAssets, int64_t &inputs, int64_t assetoshis = IsTokensvout(false, false, cpTokens, NULL, vinTx, tx.vin[i].prevout.n, assetid); if (assetoshis != 0) { - std::cerr << "AssetCalcAmounts() vin i=" << i << " assetoshis=" << assetoshis << std::endl; + //std::cerr << "AssetCalcAmounts() vin i=" << i << " assetoshis=" << assetoshis << std::endl; inputs += assetoshis; } } @@ -634,7 +634,7 @@ bool AssetCalcAmounts(struct CCcontract_info *cpAssets, int64_t &inputs, int64_t assetoshis = IsAssetvout(cpAssets, tmpprice, tmporigpubkey, tx, i, assetid); if (assetoshis != 0) { - std::cerr << "AssetCalcAmounts() vout i=" << i << " assetoshis=" << assetoshis << std::endl; + //std::cerr << "AssetCalcAmounts() vout i=" << i << " assetoshis=" << assetoshis << std::endl; outputs += assetoshis; } } diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 7673724f1..14be084b4 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -66,100 +66,102 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK } */ -UniValue AssetOrders(uint256 refassetid) +UniValue AssetOrders(uint256 refassetid, CPubKey pk, uint8_t additionalEvalCode) { static uint256 zero; UniValue result(UniValue::VARR); + struct CCcontract_info *cpAssets, assetsC; + struct CCcontract_info *cpTokens, tokensC; + + cpAssets = CCinit(&assetsC, EVAL_ASSETS); + cpTokens = CCinit(&tokensC, EVAL_TOKENS); + auto addOrders = [&](struct CCcontract_info *cp, std::vector >::const_iterator it) { uint256 txid, hashBlock, assetid, assetid2; int64_t price; std::vector origpubkey; - CTransaction vintx; + CTransaction ordertx; uint8_t funcid, evalCode; - char numstr[32], funcidstr[16], origaddr[64], assetidstr[65]; + char numstr[32], funcidstr[16], origaddr[64], origtokenaddr[64], assetidstr[65]; txid = it->first.txhash; - //std::cerr << "addOrders() txid=" << txid.GetHex() << std::endl; - if ( GetTransaction(txid, vintx, hashBlock, false) != 0 ) + LOGSTREAM("ccassets", CCLOG_DEBUG2, stream << "addOrders() checking txid=" << txid.GetHex() << std::endl); + if ( GetTransaction(txid, ordertx, hashBlock, false) != 0 ) { // for logging: funcid = DecodeAssetOpRet(vintx.vout[vintx.vout.size() - 1].scriptPubKey, evalCode, assetid, assetid2, price, origpubkey); - //std::cerr << "addOrders() vintx.vout.size()=" << vintx.vout.size() << " funcid=" << (char)(funcid ? funcid : ' ') << " assetid=" << assetid.GetHex() << std::endl; - if (vintx.vout.size() > 0 && (funcid = DecodeAssetTokenOpRet(vintx.vout[vintx.vout.size()-1].scriptPubKey, evalCode, assetid, assetid2, price, origpubkey)) != 0) + if (ordertx.vout.size() > 0 && (funcid = DecodeAssetTokenOpRet(ordertx.vout[ordertx.vout.size()-1].scriptPubKey, evalCode, assetid, assetid2, price, origpubkey)) != 0) { - if (refassetid != zero && assetid != refassetid) - { - //int32_t z; - //for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&txid)[z]); - //fprintf(stderr," txid\n"); - //for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&assetid)[z]); - //fprintf(stderr," assetid\n"); - //for (z=31; z>=0; z--) fprintf(stderr,"%02x",((uint8_t *)&refassetid)[z]); - //fprintf(stderr," refassetid\n"); - return; - } + LOGSTREAM("ccassets", CCLOG_DEBUG2, stream << "addOrders() checking ordertx.vout.size()=" << ordertx.vout.size() << " funcid=" << (char)(funcid ? funcid : ' ') << " assetid=" << assetid.GetHex() << std::endl); - //std::cerr << "addOrders() it->first.index=" << it->first.index << " vintx.vout[it->first.index].nValue=" << vintx.vout[it->first.index].nValue << std::endl; - if (vintx.vout[it->first.index].nValue == 0) - return; + if (refassetid != zero && assetid == refassetid || + pk != CPubKey() && pk == pubkey2pk(origpubkey) && (funcid == 'S' || funcid == 's')) + { - UniValue item(UniValue::VOBJ); + LOGSTREAM("ccassets", CCLOG_DEBUG2, stream << "addOrders() it->first.index=" << it->first.index << " ordertx.vout[it->first.index].nValue=" << ordertx.vout[it->first.index].nValue << std::endl); + if (ordertx.vout[it->first.index].nValue == 0) { + LOGSTREAM("ccassets", CCLOG_DEBUG2, stream << "addOrders() order with value=0 skipped" << std::endl); + return; + } - funcidstr[0] = funcid; - funcidstr[1] = 0; - item.push_back(Pair("funcid", funcidstr)); - item.push_back(Pair("txid", uint256_str(assetidstr,txid))); - item.push_back(Pair("vout", (int64_t)it->first.index)); - if ( funcid == 'b' || funcid == 'B' ) - { - sprintf(numstr,"%.8f",(double)vintx.vout[it->first.index].nValue/COIN); - item.push_back(Pair("amount",numstr)); - sprintf(numstr,"%.8f",(double)vintx.vout[0].nValue/COIN); - item.push_back(Pair("bidamount",numstr)); - } - else - { - sprintf(numstr,"%llu",(long long)vintx.vout[it->first.index].nValue); - item.push_back(Pair("amount",numstr)); - sprintf(numstr,"%llu",(long long)vintx.vout[0].nValue); - item.push_back(Pair("askamount",numstr)); - } - if ( origpubkey.size() == 33 ) - { - GetCCaddress(cp, origaddr, pubkey2pk(origpubkey)); // TODO: what is this? is it asset or token?? - item.push_back(Pair("origaddress", origaddr)); - } - if ( assetid != zeroid ) - item.push_back(Pair("tokenid",uint256_str(assetidstr,assetid))); - if ( assetid2 != zeroid ) - item.push_back(Pair("otherid",uint256_str(assetidstr,assetid2))); - if ( price > 0 ) - { - if ( funcid == 's' || funcid == 'S' || funcid == 'e' || funcid == 'e' ) + UniValue item(UniValue::VOBJ); + + funcidstr[0] = funcid; + funcidstr[1] = 0; + item.push_back(Pair("funcid", funcidstr)); + item.push_back(Pair("txid", uint256_str(assetidstr, txid))); + item.push_back(Pair("vout", (int64_t)it->first.index)); + if (funcid == 'b' || funcid == 'B') { - sprintf(numstr,"%.8f",(double)price / COIN); - item.push_back(Pair("totalrequired", numstr)); - sprintf(numstr,"%.8f",(double)price / (COIN * vintx.vout[0].nValue)); - item.push_back(Pair("price", numstr)); + sprintf(numstr, "%.8f", (double)ordertx.vout[it->first.index].nValue / COIN); + item.push_back(Pair("amount", numstr)); + sprintf(numstr, "%.8f", (double)ordertx.vout[0].nValue / COIN); + item.push_back(Pair("bidamount", numstr)); } else { - item.push_back(Pair("totalrequired", (int64_t)price)); - sprintf(numstr,"%.8f",(double)vintx.vout[0].nValue / (price * COIN)); - item.push_back(Pair("price",numstr)); + sprintf(numstr, "%llu", (long long)ordertx.vout[it->first.index].nValue); + item.push_back(Pair("amount", numstr)); + sprintf(numstr, "%llu", (long long)ordertx.vout[0].nValue); + item.push_back(Pair("askamount", numstr)); } + if (origpubkey.size() == 33) + { + GetCCaddress(cp, origaddr, pubkey2pk(origpubkey)); + item.push_back(Pair("origaddress", origaddr)); + GetTokensCCaddress(cpTokens, origtokenaddr, pubkey2pk(origpubkey)); + item.push_back(Pair("origtokenaddress", origtokenaddr)); + + } + if (assetid != zeroid) + item.push_back(Pair("tokenid", uint256_str(assetidstr, assetid))); + if (assetid2 != zeroid) + item.push_back(Pair("otherid", uint256_str(assetidstr, assetid2))); + if (price > 0) + { + if (funcid == 's' || funcid == 'S' || funcid == 'e' || funcid == 'e') + { + sprintf(numstr, "%.8f", (double)price / COIN); + item.push_back(Pair("totalrequired", numstr)); + sprintf(numstr, "%.8f", (double)price / (COIN * ordertx.vout[0].nValue)); + item.push_back(Pair("price", numstr)); + } + else + { + item.push_back(Pair("totalrequired", (int64_t)price)); + sprintf(numstr, "%.8f", (double)ordertx.vout[0].nValue / (price * COIN)); + item.push_back(Pair("price", numstr)); + } + } + result.push_back(item); + LOGSTREAM("ccassets", CCLOG_DEBUG1, stream << "addOrders() added order funcId=" << (char)(funcid ? funcid : ' ') << " it->first.index=" << it->first.index << " ordertx.vout[it->first.index].nValue=" << ordertx.vout[it->first.index].nValue << " tokenid=" << assetid.GetHex() << std::endl); } - result.push_back(item); - //fprintf(stderr,"addOrders() func.(%c) %s/v%d %.8f\n",funcid,uint256_str(assetidstr,txid),(int32_t)it->first.index,(double)vintx.vout[it->first.index].nValue/COIN); } } }; - std::vector > unspentOutputsTokens, unspentOutputsCoins; - struct CCcontract_info *cpAssets, assetsC; - - cpAssets = CCinit(&assetsC, EVAL_ASSETS); + std::vector > unspentOutputsTokens, unspentOutputsDualEvalTokens, unspentOutputsCoins; char assetsUnspendableAddr[64]; GetCCaddress(cpAssets, assetsUnspendableAddr, GetUnspendable(cpAssets, NULL)); @@ -167,24 +169,39 @@ UniValue AssetOrders(uint256 refassetid) char assetsTokensUnspendableAddr[64]; std::vector vopretNonfungible; - GetNonfungibleData(refassetid, vopretNonfungible); - if (vopretNonfungible.size() > 0) - cpAssets->additionalTokensEvalcode2 = vopretNonfungible.begin()[0]; + if (refassetid != zeroid) { + GetNonfungibleData(refassetid, vopretNonfungible); + if (vopretNonfungible.size() > 0) + cpAssets->additionalTokensEvalcode2 = vopretNonfungible.begin()[0]; + } GetTokensCCaddress(cpAssets, assetsTokensUnspendableAddr, GetUnspendable(cpAssets, NULL)); SetCCunspents(unspentOutputsTokens, assetsTokensUnspendableAddr); - // tokenasks: + // tokenbids: for (std::vector >::const_iterator itCoins = unspentOutputsCoins.begin(); itCoins != unspentOutputsCoins.end(); itCoins++) addOrders(cpAssets, itCoins); - // tokenbids: + // tokenasks: for (std::vector >::const_iterator itTokens = unspentOutputsTokens.begin(); itTokens != unspentOutputsTokens.end(); itTokens++) addOrders(cpAssets, itTokens); - + + if (additionalEvalCode != 0) { //this would be mytokenorders + char assetsDualEvalTokensUnspendableAddr[64]; + + // try also dual eval tokenasks (and we do not need bids): + cpAssets->additionalTokensEvalcode2 = additionalEvalCode; + GetTokensCCaddress(cpAssets, assetsDualEvalTokensUnspendableAddr, GetUnspendable(cpAssets, NULL)); + SetCCunspents(unspentOutputsDualEvalTokens, assetsDualEvalTokensUnspendableAddr); + + for (std::vector >::const_iterator itDualEvalTokens = unspentOutputsDualEvalTokens.begin(); + itDualEvalTokens != unspentOutputsDualEvalTokens.end(); + itDualEvalTokens++) + addOrders(cpAssets, itDualEvalTokens); + } return(result); } diff --git a/src/cc/assets.cpp b/src/cc/assets.cpp index 18f93f903..28adf9be6 100644 --- a/src/cc/assets.cpp +++ b/src/cc/assets.cpp @@ -392,7 +392,7 @@ bool AssetsValidate(struct CCcontract_info *cpAssets,Eval* eval,const CTransacti return eval->Invalid("mismatched vout0 assets dual unspendable CCaddr for fill sell"); } } - fprintf(stderr,"fill validated\n"); + //fprintf(stderr,"fill validated\n"); break; case 'E': // fillexchange ////////// not implemented yet //////////// @@ -451,7 +451,7 @@ bool AssetsValidate(struct CCcontract_info *cpAssets,Eval* eval,const CTransacti } } ////////// not implemented yet //////////// - fprintf(stderr,"fill validated\n"); + //fprintf(stderr,"fill validated\n"); break; default: @@ -462,7 +462,7 @@ bool AssetsValidate(struct CCcontract_info *cpAssets,Eval* eval,const CTransacti // what does this do? bool bPrevent = PreventCC(eval, tx, preventCCvins, numvins, preventCCvouts, numvouts); - std::cerr << "AssetsValidate() PreventCC returned=" << bPrevent << std::endl; + //std::cerr << "AssetsValidate() PreventCC returned=" << bPrevent << std::endl; return (bPrevent); } diff --git a/src/cc/cclib.cpp b/src/cc/cclib.cpp index 04ad7a66d..c13f55ce4 100644 --- a/src/cc/cclib.cpp +++ b/src/cc/cclib.cpp @@ -62,6 +62,8 @@ CClib_methods[] = { (char *)"rogue", (char *)"highlander", (char *)"gametxid", 1, 1, 'H', EVAL_ROGUE }, { (char *)"rogue", (char *)"playerinfo", (char *)"playertxid", 1, 1, 'I', EVAL_ROGUE }, { (char *)"rogue", (char *)"players", (char *)"", 0, 0, 'D', EVAL_ROGUE }, + { (char *)"rogue", (char *)"games", (char *)"", 0, 0, 'F', EVAL_ROGUE }, + { (char *)"rogue", (char *)"setname", (char *)"pname", 1, 1, 'N', EVAL_ROGUE }, #else { (char *)"sudoku", (char *)"gen", (char *)"", 0, 0, 'G', EVAL_SUDOKU }, { (char *)"sudoku", (char *)"txidinfo", (char *)"txid", 1, 1, 'T', EVAL_SUDOKU }, @@ -85,6 +87,8 @@ UniValue rogue_bailout(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue rogue_highlander(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue rogue_playerinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); UniValue rogue_players(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); +UniValue rogue_games(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); +UniValue rogue_setname(uint64_t txfee,struct CCcontract_info *cp,cJSON *params); #else bool sudoku_validate(struct CCcontract_info *cp,int32_t height,Eval *eval,const CTransaction tx); @@ -118,6 +122,10 @@ UniValue CClib_method(struct CCcontract_info *cp,char *method,cJSON *params) return(rogue_playerinfo(txfee,cp,params)); else if ( strcmp(method,"players") == 0 ) return(rogue_players(txfee,cp,params)); + else if ( strcmp(method,"games") == 0 ) + return(rogue_games(txfee,cp,params)); + else if ( strcmp(method,"setname") == 0 ) + return(rogue_setname(txfee,cp,params)); else { result.push_back(Pair("result","error")); diff --git a/src/cc/makecclib b/src/cc/makecclib index 0aecab072..ea44acdae 100755 --- a/src/cc/makecclib +++ b/src/cc/makecclib @@ -1 +1,2 @@ +#!/bin/sh gcc -std=c++11 -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I.. -I. -fPIC -shared -c -o ../libcc.so cclib.cpp diff --git a/src/cc/makerogue b/src/cc/makerogue index 08c86dee8..490576bd1 100755 --- a/src/cc/makerogue +++ b/src/cc/makerogue @@ -1,7 +1,8 @@ +#!/bin/sh cd rogue; ./configure # only need this first time make; cd .. -gcc -Wno-write-strings -DBUILD_ROGUE -std=c++11 -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I.. -I. -fPIC -shared -o librogue.so -c cclib.cpp -lncurses +gcc -Wno-write-strings -DBUILD_ROGUE -std=c++11 -I../../depends/$(shell echo `../..//depends/config.guess`/include) -I../univalue/include -I../cryptoconditions/include -I../cryptoconditions/src -I../cryptoconditions/src/asn -I.. -I. -fPIC -shared -o librogue.so -c cclib.cpp -lncurses #gcc -std=c++11 -fPIC -shared -o librogue.so cclib.o rogue/rogue.so cp librogue.so ../libcc.so diff --git a/src/cc/rogue/Makefile.in b/src/cc/rogue/Makefile.in index c2f4e551a..a6d410b23 100644 --- a/src/cc/rogue/Makefile.in +++ b/src/cc/rogue/Makefile.in @@ -101,7 +101,7 @@ HDRS = rogue.h extern.h score.h OBJS1 = vers.$(O) extern.$(O) armor.$(O) chase.$(O) command.$(O) \ daemon.$(O) daemons.$(O) fight.$(O) init.$(O) io.$(O) list.$(O) \ mach_dep.$(O) rogue.$(O) mdport.$(O) misc.$(O) monsters.$(O) \ - move.$(O) new_level.$(O) + move.$(O) new_level.$(O) OBJS2 = options.$(O) pack.$(O) passages.$(O) potions.$(O) rings.$(O) \ rip.$(O) rooms.$(O) save.$(O) scrolls.$(O) state.$(O) sticks.$(O) \ things.$(O) weapons.$(O) wizard.$(O) xcrypt.$(O) diff --git a/src/cc/rogue/armor.c b/src/cc/rogue/armor.c index 5244628b1..20c5704a8 100644 --- a/src/cc/rogue/armor.c +++ b/src/cc/rogue/armor.c @@ -9,7 +9,7 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/chase.c b/src/cc/rogue/chase.c index 73d53e1fd..059df470d 100644 --- a/src/cc/rogue/chase.c +++ b/src/cc/rogue/chase.c @@ -10,8 +10,8 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" #define DRAGONSHOT 5 /* one chance in DRAGONSHOT that a dragon will flame */ diff --git a/src/cc/rogue/command.c b/src/cc/rogue/command.c index e78e6b055..1a32246bb 100644 --- a/src/cc/rogue/command.c +++ b/src/cc/rogue/command.c @@ -10,10 +10,7 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include -#include +//#include #include "rogue.h" /* @@ -312,8 +309,12 @@ over: after = FALSE; msg(rs,"version %s. (mctesq was here)", release); when 'S': - after = FALSE; - save_game(rs); + after = FALSE; +#ifdef STANDALONE + save_game(rs); +#else + msg(rs,"Saving is disabled, use bailout rpc"); +#endif when '.': ; /* Rest command */ when ' ': after = FALSE; /* "Legal" illegal command */ when '^': diff --git a/src/cc/rogue/cursesd.c b/src/cc/rogue/cursesd.c new file mode 100644 index 000000000..643ed87de --- /dev/null +++ b/src/cc/rogue/cursesd.c @@ -0,0 +1,108 @@ +/****************************************************************************** + * Copyright © 2014-2019 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#include "cursesd.h" + +static int32_t endwinflag; + +WINDOW *initscr() +{ + if ( stdscr == 0 ) + stdscr = (WINDOW *)calloc(1,sizeof(*stdscr)); + return(stdscr); +} + +void endwin() +{ + if ( stdscr != 0 ) + free(stdscr), stdscr = 0; + endwinflag = 1; +} + +int isendwin(void) +{ + return(endwinflag); +} + +int wrefresh(WINDOW *win) +{ + return(0); +} + +int refresh(void) +{ + endwinflag = 0; + return(wrefresh(stdscr)); +} + +int wnoutrefresh(WINDOW *win) +{ + return(0); +} + +int doupdate(void) +{ + return(0); +} + +int redrawwin(WINDOW *win) +{ + return(wrefresh(win)); +} + +int wredrawln(WINDOW *win, int beg_line, int num_lines) +{ + return(wrefresh(win)); +} + +int werase(WINDOW *win) +{ + +} + +int erase(void) +{ + return(werase(stdscr)); +} + +int wclear(WINDOW *win) +{ + +} + +int clear(void) +{ + return(wclear(stdscr)); +} + +int wclrtobot(WINDOW *win) +{ + +} + +int clrtobot(void) +{ + return(wclrtobot(stdscr)); +} + +int wclrtoeol(WINDOW *win) +{ + +} + +int clrtoeol(void) +{ + return(wclrtoeol(stdscr)); +} diff --git a/src/cc/rogue/cursesd.h b/src/cc/rogue/cursesd.h new file mode 100644 index 000000000..5e3d375ca --- /dev/null +++ b/src/cc/rogue/cursesd.h @@ -0,0 +1,133 @@ +/****************************************************************************** + * Copyright © 2014-2019 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +#ifndef H_CURSESD_H +#define H_CURSESD_H + +#define LINES 24 +#define COLS 80 + +#include +#include +#include +#include +#include +#include +#include /* we need va_list */ +#include /* we want wchar_t */ +#include +#include + +#include +#include +#include +#include +#include + +#ifdef notyet + +struct cursesd_info +{ + uint8_t screen[LINES][COLS]; +} *stdscr; +typedef struct cursesd_info WINDOW; + +WINDOW *initscr(void); +int endwin(void); +int isendwin(void); +//SCREEN *newterm(const char *type, FILE *outfd, FILE *infd); +//SCREEN *set_term(SCREEN *new); +//void delscreen(SCREEN* sp); + +int refresh(void); +int wrefresh(WINDOW *win); +//int wnoutrefresh(WINDOW *win); +//int doupdate(void); +int redrawwin(WINDOW *win); +int wredrawln(WINDOW *win, int beg_line, int num_lines); + +int erase(void); +int werase(WINDOW *win); +int clear(void); +int wclear(WINDOW *win); +int clrtobot(void); +int wclrtobot(WINDOW *win); +int clrtoeol(void); +int wclrtoeol(WINDOW *win); + +#endif + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif + + +#define standout() +#define standend() +#define refresh() +#define raw() +#define noecho() +#define flushinp() +#define clear() +#define clrtoeol() + +#define addch(a) +#define werase(a) +#define wclear(a) +#define delwin(a) +#define addstr(a) +#define touchwin(a) +#define idlok(a,b) +#define clearok(a,b) +#define keypad(a,b) +#define leaveok(a,b) +#define waddch(a,b) +#define waddstr(a,b) +#define move(a,b) +#define mvwin(a,b,c) +#define wmove(a,b,c) +#define mvaddch(a,b,c) +#define mvaddstr(a,b,c) +#define wgetnstr(a,b,c) +#define getyx(a,b,c) +#define mvcur(a,b,c,d) +#define mvwaddch(a,b,c,d) +#define mvprintw(...) +#define printw(...) +#define wprintw(...) +#define mvwprintw(...) + + +#define A_CHARTEXT 0xff +#define inch() 0 +#define endwin() 1 +#define isendwin() 0 +#define baudrate() 9600 +#define killchar() 3 +#define erasechar() 8 +#define wclrtoeol(a) 0 +#define wrefresh(a) 0 +#define unctrl(a) "^x" +#define getmaxx(a) COLS +#define getmaxy(a) LINES +#define mvinch(a,b) '.' +#define mvwinch(a,b,c) 0 +#define newwin(a,b,c,d) 0 +#define subwin(a,b,c,d,e) 0 + +#endif diff --git a/src/cc/rogue/daemon.c b/src/cc/rogue/daemon.c index 8309dc642..1da06d499 100644 --- a/src/cc/rogue/daemon.c +++ b/src/cc/rogue/daemon.c @@ -11,7 +11,7 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include +//#include #include "rogue.h" #define EMPTY 0 diff --git a/src/cc/rogue/daemons.c b/src/cc/rogue/daemons.c index 436aa004d..42e685320 100644 --- a/src/cc/rogue/daemons.c +++ b/src/cc/rogue/daemons.c @@ -10,7 +10,7 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/extern.c b/src/cc/rogue/extern.c index b84e6fa7b..fdb77307c 100644 --- a/src/cc/rogue/extern.c +++ b/src/cc/rogue/extern.c @@ -10,7 +10,7 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include +//#include #include "rogue.h" @@ -452,7 +452,7 @@ void externs_clear() memset(p_colors,0,sizeof(p_colors)); memset(prbuf,0,sizeof(prbuf)); memset(r_stones,0,sizeof(r_stones)); - memset(whoami,0,sizeof(whoami)); + //memset(whoami,0,sizeof(whoami)); memset(ws_made,0,sizeof(ws_made)); memset(ws_type,0,sizeof(ws_type)); runch = 0; /* Direction player is running */ diff --git a/src/cc/rogue/extern.h b/src/cc/rogue/extern.h index 486d85ff1..fc3454830 100644 --- a/src/cc/rogue/extern.h +++ b/src/cc/rogue/extern.h @@ -13,6 +13,9 @@ #ifndef H_EXTERN_ROGUE_H #define H_EXTERN_ROGUE_H +#include +#include + #ifdef HAVE_CONFIG_H #ifdef PDCURSES #undef HAVE_UNISTD_H diff --git a/src/cc/rogue/fight.c b/src/cc/rogue/fight.c index 7f4aad587..43474616e 100644 --- a/src/cc/rogue/fight.c +++ b/src/cc/rogue/fight.c @@ -10,10 +10,10 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include "rogue.h" //#define EQSTR(a, b) (strcmp(a, b) == 0) diff --git a/src/cc/rogue/init.c b/src/cc/rogue/init.c index 1f63e1d51..1603474e2 100644 --- a/src/cc/rogue/init.c +++ b/src/cc/rogue/init.c @@ -10,10 +10,10 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/io.c b/src/cc/rogue/io.c index 30795f2ad..6791c26a4 100644 --- a/src/cc/rogue/io.c +++ b/src/cc/rogue/io.c @@ -4,10 +4,10 @@ * @(#)io.c 4.32 (Berkeley) 02/05/99 */ -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include "rogue.h" /* @@ -162,7 +162,8 @@ readchar(struct rogue_state *rs) //fprintf(stderr,"(%c) ",rs->keystrokes[rs->ind]); return(rs->keystrokes[rs->ind++]); } - fprintf(stderr,"replay finished but readchar called\n"); + if ( rs->replaydone != 0 ) + fprintf(stderr,"replay finished but readchar called\n"); rs->replaydone = (uint32_t)time(NULL); //if ( (rand() & 1) == 0 ) // return(ESCAPE); diff --git a/src/cc/rogue/list.c b/src/cc/rogue/list.c index 6affc662c..622af60cd 100644 --- a/src/cc/rogue/list.c +++ b/src/cc/rogue/list.c @@ -10,9 +10,9 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include +//#include +//#include +//#include #include "rogue.h" #ifdef MASTER diff --git a/src/cc/rogue/mach_dep.c b/src/cc/rogue/mach_dep.c index 34e502816..6d0e1c66f 100644 --- a/src/cc/rogue/mach_dep.c +++ b/src/cc/rogue/mach_dep.c @@ -46,7 +46,8 @@ #include #include #include -#include +//#include +#include "rogue.h" #include "extern.h" #define NOOP(x) (x += 0) diff --git a/src/cc/rogue/main.c b/src/cc/rogue/main.c index a41e51dc3..c3484eafe 100644 --- a/src/cc/rogue/main.c +++ b/src/cc/rogue/main.c @@ -19,6 +19,7 @@ #include #include #include +#include #define SMALLVAL 0.000000000000001 #define SATOSHIDEN ((uint64_t)100000000L) @@ -190,7 +191,11 @@ int32_t safecopy(char *dest,char *src,long len) #define true 1 #define false 0 +#ifdef STANDALONE +#include "../komodo/src/komodo_cJSON.c" +#else #include "../../komodo_cJSON.c" +#endif int32_t rogue_replay(uint64_t seed,int32_t sleeptime); int rogue(int argc, char **argv, char **envp); diff --git a/src/cc/rogue/mdport.c b/src/cc/rogue/mdport.c index acd257617..443ef1e60 100644 --- a/src/cc/rogue/mdport.c +++ b/src/cc/rogue/mdport.c @@ -44,7 +44,7 @@ #undef MOUSE_MOVED #endif -#include +//#include #include "extern.h" #if defined(HAVE_SYS_TYPES) diff --git a/src/cc/rogue/misc.c b/src/cc/rogue/misc.c index 168886b6b..7db9d073a 100644 --- a/src/cc/rogue/misc.c +++ b/src/cc/rogue/misc.c @@ -10,10 +10,10 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/monsters.c b/src/cc/rogue/monsters.c index 4649de9a2..2f6d68362 100644 --- a/src/cc/rogue/monsters.c +++ b/src/cc/rogue/monsters.c @@ -10,10 +10,10 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" -#include +//#include /* * List of monsters in rough order of vorpalness diff --git a/src/cc/rogue/move.c b/src/cc/rogue/move.c index 3bdf90d37..c70d668ca 100644 --- a/src/cc/rogue/move.c +++ b/src/cc/rogue/move.c @@ -10,8 +10,8 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/new_level.c b/src/cc/rogue/new_level.c index 9dc0d761f..b55d3e42c 100644 --- a/src/cc/rogue/new_level.c +++ b/src/cc/rogue/new_level.c @@ -11,8 +11,8 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" #define TREAS_ROOM 20 /* one chance in TREAS_ROOM for a treasure room */ diff --git a/src/cc/rogue/options.c b/src/cc/rogue/options.c index 6907da598..d74979365 100644 --- a/src/cc/rogue/options.c +++ b/src/cc/rogue/options.c @@ -12,10 +12,10 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include "rogue.h" #define EQSTR(a, b, c) (strncmp(a, b, c) == 0) diff --git a/src/cc/rogue/pack.c b/src/cc/rogue/pack.c index ee628b4f0..2f683441b 100644 --- a/src/cc/rogue/pack.c +++ b/src/cc/rogue/pack.c @@ -10,9 +10,9 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include +//#include +//#include +//#include #include "rogue.h" /* @@ -165,6 +165,7 @@ out: bool pack_room(struct rogue_state *rs,bool from_floor, THING *obj) { + inpack = num_packitems(); if (++inpack > MAXPACK) { if (!terse) @@ -178,7 +179,8 @@ pack_room(struct rogue_state *rs,bool from_floor, THING *obj) inpack = MAXPACK; return FALSE; } - + //fprintf(stderr,"inpack.%d vs MAX.%d\n",inpack,MAXPACK), sleep(2); + if (from_floor) { detach(lvl_obj, obj); @@ -244,6 +246,16 @@ pack_char() * List what is in the pack. Return TRUE if there is something of * the given type. */ + +int32_t num_packitems() +{ + THING *list = pack; + int32_t type = 0,n = 0; + for (; list != NULL; list = next(list)) + n++; + return(n); +} + bool inventory(struct rogue_state *rs,THING *list, int type) { @@ -272,6 +284,8 @@ inventory(struct rogue_state *rs,THING *list, int type) } msg_esc = FALSE; } + //if ( n_objs != inpack ) + // fprintf(stderr,"n_objs.%d vs inpack.%d\n",n_objs,inpack), sleep(2); if (n_objs == 0) { if (terse) diff --git a/src/cc/rogue/passages.c b/src/cc/rogue/passages.c index 79b3706aa..5437f4972 100644 --- a/src/cc/rogue/passages.c +++ b/src/cc/rogue/passages.c @@ -10,8 +10,8 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/potions.c b/src/cc/rogue/potions.c index de09efb9b..00865b5dd 100644 --- a/src/cc/rogue/potions.c +++ b/src/cc/rogue/potions.c @@ -10,8 +10,8 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" typedef struct diff --git a/src/cc/rogue/rings.c b/src/cc/rogue/rings.c index 56f7a0294..747da302a 100644 --- a/src/cc/rogue/rings.c +++ b/src/cc/rogue/rings.c @@ -10,7 +10,7 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/rip.c b/src/cc/rogue/rip.c index a5b3e7208..be97fb867 100644 --- a/src/cc/rogue/rip.c +++ b/src/cc/rogue/rip.c @@ -11,14 +11,14 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include +//#include +//#include +//#include #include -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include "rogue.h" #include "score.h" diff --git a/src/cc/rogue/rogue.c b/src/cc/rogue/rogue.c index fffa6203d..be17b25be 100644 --- a/src/cc/rogue/rogue.c +++ b/src/cc/rogue/rogue.c @@ -8,14 +8,17 @@ * @(#)main.c 4.22 (Berkeley) 02/05/99 */ -#include -#include +//#include +//#include #include -#include -#include -#include +//#include +//#include #include "rogue.h" +#ifdef STANDALONE +#include "../komodo/src/komodo_cJSON.h" +#else #include "../../komodo_cJSON.h" +#endif /* * main: @@ -84,6 +87,8 @@ void rogueiterate(struct rogue_state *rs) endwin(); my_exit(1); } + //fprintf(stderr,"LINES %d, COLS %d\n",LINES,COLS); + // Set up windows if ( hw == NULL ) hw = newwin(LINES, COLS, 0, 0); @@ -148,7 +153,9 @@ uint8_t *OS_fileptr(long *allocsizep,char *fname); int32_t rogue_setplayerdata(struct rogue_state *rs,char *gametxidstr) { - char cmd[32768]; int32_t i,n,retval=-1; char *filestr,*statusstr,*datastr,fname[128]; long allocsize; cJSON *retjson,*array,*item; + char cmd[32768]; int32_t i,n,retval=-1; char *filestr,*pname,*statusstr,*datastr,fname[128]; long allocsize; cJSON *retjson,*array,*item; + if ( gametxidstr == 0 || *gametxidstr == 0 ) + return(retval); sprintf(fname,"%s.gameinfo",gametxidstr); sprintf(cmd,"./komodo-cli -ac_name=ROGUE cclib gameinfo 17 \\\"[%%22%s%%22]\\\" > %s",gametxidstr,fname); if ( system(cmd) != 0 ) @@ -170,8 +177,10 @@ int32_t rogue_setplayerdata(struct rogue_state *rs,char *gametxidstr) retval = 0; if ( (item= jobj(item,"player")) != 0 && (datastr= jstr(item,"data")) != 0 ) { + if ( (pname= jstr(item,"pname")) != 0 && strlen(pname) < MAXSTR-1 ) + strcpy(whoami,pname); decode_hex((uint8_t *)&rs->P,(int32_t)strlen(datastr)/2,datastr); - //fprintf(stderr,"set datastr[%d]\n",(int32_t)strlen(datastr)); + fprintf(stderr,"set pname[%s] %s\n",pname==0?"":pname,jprint(item,0)); rs->restoring = 1; } } @@ -188,12 +197,15 @@ int32_t rogue_setplayerdata(struct rogue_state *rs,char *gametxidstr) void rogue_progress(uint64_t seed,char *keystrokes,int32_t num) { char cmd[16384],hexstr[16384]; int32_t i; - for (i=0; i> keystrokes.log",Gametxidstr,hexstr); - if ( system(cmd) != 0 ) - fprintf(stderr,"error issuing (%s)\n",cmd); + if ( Gametxidstr[0] != 0 ) + { + for (i=0; i> keystrokes.log",Gametxidstr,hexstr); + if ( system(cmd) != 0 ) + fprintf(stderr,"error issuing (%s)\n",cmd); + } } int32_t flushkeystrokes(struct rogue_state *rs) @@ -236,21 +248,24 @@ int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t nu } uint32_t starttime = (uint32_t)time(NULL); rogueiterate(rs); - /*fprintf(stderr,"elapsed %d seconds\n",(uint32_t)time(NULL) - starttime); - sleep(2); - - starttime = (uint32_t)time(NULL); - for (i=0; i<100; i++) + if ( 0 ) { - memset(rs,0,sizeof(*rs)); - rs->seed = seed; - rs->keystrokes = keystrokes; - rs->numkeys = num; - rs->sleeptime = 0; - rogueiterate(rs); + fprintf(stderr,"elapsed %d seconds\n",(uint32_t)time(NULL) - starttime); + sleep(2); + + starttime = (uint32_t)time(NULL); + for (i=0; i<10000; i++) + { + memset(rs,0,sizeof(*rs)); + rs->seed = seed; + rs->keystrokes = keystrokes; + rs->numkeys = num; + rs->sleeptime = 0; + rogueiterate(rs); + } + fprintf(stderr,"elapsed %d seconds\n",(uint32_t)time(NULL)-starttime); + sleep(3); } - fprintf(stderr,"elapsed %d seconds\n",(uint32_t)time(NULL)-starttime); - sleep(1);*/ if ( (fp= fopen("checkfile","wb")) != 0 ) { save_file(rs,fp,0); @@ -358,8 +373,8 @@ int rogue(int argc, char **argv, char **envp) if ((env = getenv("ROGUEOPTS")) != NULL) parse_opts(env); - if (env == NULL || whoami[0] == '\0') - strucpy(whoami, md_getusername(), (int) strlen(md_getusername())); + //if (env == NULL || whoami[0] == '\0') + // strucpy(whoami, md_getusername(), (int) strlen(md_getusername())); lowtime = (int) time(NULL); #ifdef MASTER if (wizard && getenv("SEED") != NULL) diff --git a/src/cc/rogue/rogue.h b/src/cc/rogue/rogue.h index 5eccb2e8c..7d00bd8cf 100644 --- a/src/cc/rogue/rogue.h +++ b/src/cc/rogue/rogue.h @@ -12,9 +12,43 @@ #ifndef H_ROGUE_H #define H_ROGUE_H +#include +#include +#include +#include +#include +#include +#include /* we need va_list */ +#include /* we want wchar_t */ +#include +#include + +#include +#include +#include +#include +#include + +#ifndef DONTUSEGUI +#include +#else + +#include "cursesd.h" +#endif + +#ifdef LINES +#undef LINES +#endif +#ifdef COLS +#undef COLS +#endif + +#define LINES 24 +#define COLS 80 #include "extern.h" + #undef lines #define NOOP(x) (x += 0) @@ -782,6 +816,7 @@ THING *leave_pack(struct rogue_state *rs,THING *obj, bool newobj, bool all); THING *new_item(void); THING *new_thing(struct rogue_state *rs); void end_line(struct rogue_state *rs); +int32_t num_packitems(); void runners(struct rogue_state *rs,int); void land(struct rogue_state *rs,int); diff --git a/src/cc/rogue/rooms.c b/src/cc/rogue/rooms.c index 31991b08f..41041d627 100644 --- a/src/cc/rogue/rooms.c +++ b/src/cc/rogue/rooms.c @@ -10,8 +10,8 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" typedef struct spot { /* position matrix for maze positions */ diff --git a/src/cc/rogue/save.c b/src/cc/rogue/save.c index adec30e2e..718c5074b 100644 --- a/src/cc/rogue/save.c +++ b/src/cc/rogue/save.c @@ -10,13 +10,13 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include -#include -#include -#include -#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include #include "rogue.h" #include "score.h" diff --git a/src/cc/rogue/scrolls.c b/src/cc/rogue/scrolls.c index b6854ab07..5554a5701 100644 --- a/src/cc/rogue/scrolls.c +++ b/src/cc/rogue/scrolls.c @@ -10,8 +10,8 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include +//#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/state.c b/src/cc/rogue/state.c index 1779bcbcc..e034039a8 100644 --- a/src/cc/rogue/state.c +++ b/src/cc/rogue/state.c @@ -29,9 +29,9 @@ SUCH DAMAGE. */ -#include -#include -#include +//#include +//#include +//#include #include "rogue.h" /************************************************************************/ @@ -1374,9 +1374,9 @@ void rogue_restoreobject(THING *o,struct rogue_packitem *item) break; // cur_armor and cur_weapon should be set } - char packitemstr[256]; - strcpy(packitemstr,inv_name(o,FALSE)); - fprintf(stderr,"packitem.(%s)\n",packitemstr); + //char packitemstr[256]; + //strcpy(packitemstr,inv_name(o,FALSE)); + //fprintf(stderr,"packitem.(%s)\n",packitemstr); } } diff --git a/src/cc/rogue/sticks.c b/src/cc/rogue/sticks.c index 39e098339..f048f9423 100644 --- a/src/cc/rogue/sticks.c +++ b/src/cc/rogue/sticks.c @@ -11,9 +11,9 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include +//#include +//#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue/things.c b/src/cc/rogue/things.c index 4e572c60b..29c51c4ed 100644 --- a/src/cc/rogue/things.c +++ b/src/cc/rogue/things.c @@ -11,9 +11,9 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include +//#include +//#include +//#include #include "rogue.h" /* @@ -498,55 +498,55 @@ add_line(struct rogue_state *rs,char *fmt, char *arg) if (line_cnt >= LINES - 1 || fmt == NULL) { if (inv_type == INV_OVER && fmt == NULL && !newpage) - { - msg(rs,""); + { + msg(rs,""); if ( rs->sleeptime != 0 ) refresh(); - tw = newwin(line_cnt + 1, maxlen + 2, 0, COLS - maxlen - 3); - sw = subwin(tw, line_cnt + 1, maxlen + 1, 0, COLS - maxlen - 2); - for (y = 0; y <= line_cnt; y++) - { - wmove(sw, y, 0); - for (x = 0; x <= maxlen; x++) - waddch(sw, mvwinch(hw, y, x)); - } - wmove(tw, line_cnt, 1); - waddstr(tw, prompt); - /* - * if there are lines below, use 'em - */ - if (LINES > NUMLINES) - { - if (NUMLINES + line_cnt > LINES) - mvwin(tw, LINES - (line_cnt + 1), COLS - maxlen - 3); - else - mvwin(tw, NUMLINES, 0); - } - touchwin(tw); - wrefresh(tw); - wait_for(rs,' '); - if (md_hasclreol()) - { - werase(tw); - leaveok(tw, TRUE); - wrefresh(tw); - } - delwin(tw); - touchwin(stdscr); + tw = newwin(line_cnt + 1, maxlen + 2, 0, COLS - maxlen - 3); + sw = subwin(tw, line_cnt + 1, maxlen + 1, 0, COLS - maxlen - 2); + for (y = 0; y <= line_cnt; y++) + { + wmove(sw, y, 0); + for (x = 0; x <= maxlen; x++) + waddch(sw, mvwinch(hw, y, x)); + } + wmove(tw, line_cnt, 1); + waddstr(tw, prompt); + /* + * if there are lines below, use 'em + */ + if (LINES > NUMLINES) + { + if (NUMLINES + line_cnt > LINES) + mvwin(tw, LINES - (line_cnt + 1), COLS - maxlen - 3); + else + mvwin(tw, NUMLINES, 0); + } + touchwin(tw); + wrefresh(tw); + wait_for(rs,' '); + if (md_hasclreol()) + { + werase(tw); + leaveok(tw, TRUE); + wrefresh(tw); + } + delwin(tw); + touchwin(stdscr); } else { - wmove(hw, LINES - 1, 0); - waddstr(hw, prompt); - wrefresh(hw); - wait_for(rs,' '); - clearok(curscr, TRUE); - wclear(hw); - touchwin(stdscr); - } - newpage = TRUE; - line_cnt = 0; - maxlen = (int) strlen(prompt); + wmove(hw, LINES - 1, 0); + waddstr(hw, prompt); + wrefresh(hw); + wait_for(rs,' '); + clearok(curscr, TRUE); + wclear(hw); + touchwin(stdscr); + } + newpage = TRUE; + line_cnt = 0; + maxlen = (int) strlen(prompt); } if (fmt != NULL && !(line_cnt == 0 && *fmt == '\0')) { diff --git a/src/cc/rogue/weapons.c b/src/cc/rogue/weapons.c index 6693f0814..e5a5eacf6 100644 --- a/src/cc/rogue/weapons.c +++ b/src/cc/rogue/weapons.c @@ -10,9 +10,9 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include +//#include +//#include +//#include #include "rogue.h" #define NO_WEAPON -1 diff --git a/src/cc/rogue/wizard.c b/src/cc/rogue/wizard.c index e56928d33..ee16b2d9b 100644 --- a/src/cc/rogue/wizard.c +++ b/src/cc/rogue/wizard.c @@ -11,10 +11,10 @@ * See the file LICENSE.TXT for full copyright and licensing information. */ -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include "rogue.h" /* diff --git a/src/cc/rogue_rpc.cpp b/src/cc/rogue_rpc.cpp index 2ba2dd980..5daca5d1c 100644 --- a/src/cc/rogue_rpc.cpp +++ b/src/cc/rogue_rpc.cpp @@ -21,6 +21,25 @@ #define ROGUE_REGISTRATIONSIZE (100 * 10000) #define ROGUE_MAXPLAYERS 64 // need to send unused fees back to globalCC address to prevent leeching #define ROGUE_MAXKEYSTROKESGAP 60 +#define ROGUE_MAXITERATIONS 777 + +#define MAXPACK 23 +struct rogue_packitem +{ + int32_t type,launch,count,which,hplus,dplus,arm,flags,group; + char damage[8],hurldmg[8]; +}; +struct rogue_player +{ + int32_t gold,hitpoints,strength,level,experience,packsize,dungeonlevel,pad; + struct rogue_packitem roguepack[MAXPACK]; +}; +int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player); +#define ROGUE_DECLARED_PACK +void rogue_packitemstr(char *packitemstr,struct rogue_packitem *item); + + +std::string Rogue_pname = ""; /* Roguelander - using highlander competition between rogue players @@ -116,7 +135,8 @@ // todo: // verify keystrokes tx is in mempool and confirmed -// chaining when mempool tx sometimes infinite loops +// chaining when mempool tx sometimes infinite loops? +// bailout stealing, is it possible? //////////////////////// start of CClib interface //./komodod -ac_name=ROGUE -ac_supply=1000000 -pubkey=03951a6f7967ad784453116bc55cd30c54f91ea8a5b1e9b04d6b29cfd6b395ba6c -addnode=5.9.102.210 -ac_cclib=rogue -ac_perc=10000000 -ac_reward=100000000 -ac_cc=60001 -ac_script=2ea22c80203d1579313abe7d8ea85f48c65ea66fc512c878c0d0e6f6d54036669de940febf8103120c008203000401cc > /dev/null & @@ -130,20 +150,6 @@ // ./c cclib bailout 17 \"[%226d3243c6e5ab383898b28a87e01f6c00b5bdd9687020f17f5caacc8a61febd19%22]\" // ./komodo-cli -ac_name=ROGUE cclib register 17 \"[%22a898f4ceef7647ba113b9f3c24ef045f5d134935a3b09bdd1a997b9d474f4c1b%22,%22f11d0cb4e2e4c21f029a1146f8e5926f11456885b7ab7d665096f5efedec8ea0%22]\" -#define MAXPACK 23 -struct rogue_packitem -{ - int32_t type,launch,count,which,hplus,dplus,arm,flags,group; - char damage[8],hurldmg[8]; -}; -struct rogue_player -{ - int32_t gold,hitpoints,strength,level,experience,packsize,dungeonlevel,pad; - struct rogue_packitem roguepack[MAXPACK]; -}; -int32_t rogue_replay2(uint8_t *newdata,uint64_t seed,char *keystrokes,int32_t num,struct rogue_player *player); -#define ROGUE_DECLARED_PACK -void rogue_packitemstr(char *packitemstr,struct rogue_packitem *item); CScript rogue_newgameopret(int64_t buyin,int32_t maxplayers) { @@ -167,14 +173,14 @@ CScript rogue_keystrokesopret(uint256 gametxid,uint256 batontxid,CPubKey pk,std: return(opret); } -CScript rogue_highlanderopret(uint8_t funcid,uint256 gametxid,int32_t regslot,CPubKey pk,std::vectorplayerdata) +CScript rogue_highlanderopret(uint8_t funcid,uint256 gametxid,int32_t regslot,CPubKey pk,std::vectorplayerdata,std::string pname) { - CScript opret; uint8_t evalcode = EVAL_ROGUE; - opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << gametxid << regslot << pk << playerdata); + CScript opret; uint8_t evalcode = EVAL_ROGUE; std::string symbol(ASSETCHAINS_SYMBOL); + opret << OP_RETURN << E_MARSHAL(ss << evalcode << funcid << gametxid << symbol << pname << regslot << pk << playerdata ); return(opret); } -uint8_t rogue_highlanderopretdecode(uint256 &gametxid, uint256 &tokenid, int32_t ®slot, CPubKey &pk, std::vector &playerdata, CScript scriptPubKey) +uint8_t rogue_highlanderopretdecode(uint256 &gametxid, uint256 &tokenid, int32_t ®slot, CPubKey &pk, std::vector &playerdata, std::string &symbol, std::string &pname,CScript scriptPubKey) { std::string name, description; std::vector vorigPubkey; std::vector vopretNonfungible, vopret, vopretDummy,origpubkey; @@ -192,7 +198,7 @@ uint8_t rogue_highlanderopretdecode(uint256 &gametxid, uint256 &tokenid, int32_t GetNonfungibleData(tokenid, vopretNonfungible); //load nonfungible data from the 'tokenbase' tx vopret = vopretNonfungible; } - if ( vopret.size() > 2 && E_UNMARSHAL(vopret, ss >> e; ss >> f; ss >> gametxid; ss >> regslot; ss >> pk; ss >> playerdata) != 0 && e == EVAL_ROGUE && (f == 'H' || f == 'Q') ) + if ( vopret.size() > 2 && E_UNMARSHAL(vopret, ss >> e; ss >> f; ss >> gametxid; ss >> symbol; ss >> pname; ss >> regslot; ss >> pk; ss >> playerdata) != 0 && e == EVAL_ROGUE && (f == 'H' || f == 'Q') ) { return(f); } @@ -231,7 +237,7 @@ uint8_t rogue_registeropretdecode(uint256 &gametxid,uint256 &tokenid,uint256 &pl { return(f); } - fprintf(stderr,"e.%d f.%c game.%s playertxid.%s\n",e,f,gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); + //fprintf(stderr,"e.%d f.%c game.%s playertxid.%s\n",e,f,gametxid.GetHex().c_str(),playertxid.GetHex().c_str()); return(0); } @@ -363,7 +369,7 @@ int32_t rogue_isvalidgame(struct CCcontract_info *cp,int32_t &gameheight,CTransa } else return(-1); } -UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint256 tokenid) +UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint256 tokenid,std::string symbol,std::string pname) { int32_t i; struct rogue_player P; char packitemstr[512],*datastr; UniValue obj(UniValue::VOBJ),a(UniValue::VARR); memset(&P,0,sizeof(P)); @@ -396,21 +402,29 @@ UniValue rogue_playerobj(std::vector playerdata,uint256 playertxid,uint obj.push_back(Pair("level",(int64_t)P.level)); obj.push_back(Pair("experience",(int64_t)P.experience)); obj.push_back(Pair("dungeonlevel",(int64_t)P.dungeonlevel)); + obj.push_back(Pair("chain",symbol)); + obj.push_back(Pair("pname",pname)); return(obj); } int32_t rogue_iterateplayer(uint256 ®istertxid,uint256 firsttxid,int32_t firstvout,uint256 lasttxid) // retrace playertxid vins to reach highlander <- this verifies player is valid and rogue_playerdataspend makes sure it can only be used once { - uint256 spenttxid,txid = firsttxid; int32_t spentvini,vout = firstvout; + uint256 spenttxid,txid = firsttxid; int32_t spentvini,n,vout = firstvout; registertxid = zeroid; if ( vout < 0 ) return(-1); + n = 0; while ( (spentvini= myIsutxo_spent(spenttxid,txid,vout)) == 0 ) { txid = spenttxid; vout = spentvini; if ( registertxid == zeroid ) registertxid = txid; + if ( ++n >= ROGUE_MAXITERATIONS ) + { + fprintf(stderr,"rogue_iterateplayer n.%d, seems something is wrong\n",n); + return(-2); + } } if ( txid == lasttxid ) return(0); @@ -427,12 +441,12 @@ int32_t rogue_iterateplayer(uint256 ®istertxid,uint256 firsttxid,int32_t firs origplayergame is the gametxid that ends up being won by the highlander and they are linked directly as the highlander tx spends gametxid.vout0 */ -int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint256 &tokenid,CPubKey &pk,std::vector &playerdata,uint256 playertxid) +int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint256 &tokenid,CPubKey &pk,std::vector &playerdata,std::string &symbol,std::string &pname,uint256 playertxid) { uint256 origplayertxid,hashBlock,gametxid,registertxid; CTransaction gametx,playertx,highlandertx; std::vector vopret; uint8_t *script,e,f; int32_t i,regslot,gameheight,numvouts,maxplayers; int64_t buyin; if ( GetTransaction(playertxid,playertx,hashBlock,false) != 0 && (numvouts= playertx.vout.size()) > 0 ) { - if ( (f= rogue_highlanderopretdecode(gametxid,tokenid,regslot,pk,playerdata,playertx.vout[numvouts-1].scriptPubKey)) == 'H' || f == 'Q' ) + if ( (f= rogue_highlanderopretdecode(gametxid,tokenid,regslot,pk,playerdata,symbol,pname,playertx.vout[numvouts-1].scriptPubKey)) == 'H' || f == 'Q' ) { if ( tokenid != zeroid ) { @@ -452,7 +466,7 @@ int32_t rogue_playerdata(struct CCcontract_info *cp,uint256 &origplayergame,uint return(0); } else fprintf(stderr,"hash mismatch or illegal gametxid\n"); } else fprintf(stderr,"invalid game %s\n",gametxid.GetHex().c_str()); - } + } //else fprintf(stderr,"invalid player funcid.%c\n",f); } else fprintf(stderr,"couldnt get playertxid.%s\n",playertxid.GetHex().c_str()); return(-1); } @@ -467,9 +481,9 @@ int32_t rogue_playerdataspend(CMutableTransaction &mtx,uint256 playertxid,int32_ } else return(-1); } -int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **keystrokesp,int32_t &numkeys,int32_t ®slot,std::vector &playerdata,uint256 &batontxid,int32_t &batonvout,int64_t &batonvalue,int32_t &batonht,uint256 gametxid,CTransaction gametx,int32_t maxplayers,char *destaddr,int32_t &numplayers) +int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **keystrokesp,int32_t &numkeys,int32_t ®slot,std::vector &playerdata,uint256 &batontxid,int32_t &batonvout,int64_t &batonvalue,int32_t &batonht,uint256 gametxid,CTransaction gametx,int32_t maxplayers,char *destaddr,int32_t &numplayers,std::string &symbol,std::string &pname) { - int32_t i,numvouts,spentvini,matches = 0; CPubKey pk; uint256 tid,spenttxid,tokenid,hashBlock,txid,origplayergame; CTransaction spenttx,matchtx,batontx; std::vector checkdata; CBlockIndex *pindex; char ccaddr[64],*keystrokes=0; + int32_t i,numvouts,spentvini,n,matches = 0; CPubKey pk; uint256 tid,active,spenttxid,tokenid,hashBlock,txid,origplayergame; CTransaction spenttx,matchtx,batontx; std::vector checkdata; CBlockIndex *pindex; char ccaddr[64],*keystrokes=0; numkeys = numplayers = 0; playertxid = zeroid; for (i=0; i= 2 ) { uint256 g,b; CPubKey p; std::vector k; - if ( rogue_keystrokesopretdecode(g,b,p,k,spenttx.vout[1].scriptPubKey) == 'K' ) + if ( rogue_keystrokesopretdecode(g,b,p,k,spenttx.vout[spenttx.vout.size()-1].scriptPubKey) == 'K' ) { keystrokes = (char *)realloc(keystrokes,numkeys + (int32_t)k.size()); for (i=0; i= ROGUE_MAXITERATIONS ) + { + fprintf(stderr,"rogue_findbaton n.%d, seems something is wrong\n",n); + return(-5); + } } //fprintf(stderr,"set baton %s\n",txid.GetHex().c_str()); batontxid = txid; @@ -561,7 +583,7 @@ int32_t rogue_findbaton(struct CCcontract_info *cp,uint256 &playertxid,char **ke void rogue_gameplayerinfo(struct CCcontract_info *cp,UniValue &obj,uint256 gametxid,CTransaction gametx,int32_t vout,int32_t maxplayers,char *myrogueaddr) { // identify if bailout or quit or timed out - uint256 batontxid,spenttxid,gtxid,ptxid,tokenid,hashBlock,playertxid; CTransaction spenttx,batontx; int32_t numplayers,regslot,numkeys,batonvout,batonht,retval; int64_t batonvalue; std::vector playerdata; char destaddr[64]; + uint256 batontxid,spenttxid,gtxid,ptxid,tokenid,hashBlock,playertxid; CTransaction spenttx,batontx; int32_t numplayers,regslot,numkeys,batonvout,batonht,retval; int64_t batonvalue; std::vector playerdata; char destaddr[64]; std::string symbol,pname; destaddr[0] = 0; if ( myIsutxo_spent(spenttxid,gametxid,vout) >= 0 ) { @@ -569,7 +591,7 @@ void rogue_gameplayerinfo(struct CCcontract_info *cp,UniValue &obj,uint256 gamet Getscriptaddress(destaddr,spenttx.vout[0].scriptPubKey); } obj.push_back(Pair("slot",(int64_t)vout-1)); - if ( (retval= rogue_findbaton(cp,playertxid,0,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,destaddr,numplayers)) == 0 ) + if ( (retval= rogue_findbaton(cp,playertxid,0,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,destaddr,numplayers,symbol,pname)) == 0 ) { if ( CCgettxout(gametxid,maxplayers+vout,1) == 10000 ) { @@ -588,7 +610,7 @@ void rogue_gameplayerinfo(struct CCcontract_info *cp,UniValue &obj,uint256 gamet obj.push_back(Pair("batonvalue",ValueFromAmount(batonvalue))); obj.push_back(Pair("batonht",(int64_t)batonht)); if ( playerdata.size() > 0 ) - obj.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid))); + obj.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid,symbol,pname))); } else fprintf(stderr,"findbaton err.%d\n",retval); } @@ -667,7 +689,7 @@ UniValue rogue_newgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) UniValue rogue_playerinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { - UniValue result(UniValue::VOBJ); std::vector playerdata; uint256 playertxid,tokenid,origplayergame;int32_t n; CPubKey pk; bits256 t; + UniValue result(UniValue::VOBJ); std::vector playerdata; uint256 playertxid,tokenid,origplayergame;int32_t n; CPubKey pk; bits256 t; std::string symbol,pname; result.push_back(Pair("result","success")); rogue_univalue(result,"playerinfo",-1,-1); if ( (params= cclib_reparse(&n,params)) != 0 ) @@ -675,9 +697,9 @@ UniValue rogue_playerinfo(uint64_t txfee,struct CCcontract_info *cp,cJSON *param if ( n > 0 ) { playertxid = juint256(jitem(params,0)); - if ( rogue_playerdata(cp,origplayergame,tokenid,pk,playerdata,playertxid) < 0 ) + if ( rogue_playerdata(cp,origplayergame,tokenid,pk,playerdata,symbol,pname,playertxid) < 0 ) return(cclib_error(result,"invalid playerdata")); - result.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid))); + result.push_back(Pair("player",rogue_playerobj(playerdata,playertxid,tokenid,symbol,pname))); } else return(cclib_error(result,"no playertxid")); return(result); } else return(cclib_error(result,"couldnt reparse params")); @@ -691,7 +713,7 @@ UniValue rogue_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) // vin3+ -> buyin // vout0 -> keystrokes/completion baton CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - UniValue result(UniValue::VOBJ); char destaddr[64],coinaddr[64]; uint256 tokenid,gametxid,origplayergame,playertxid,hashBlock; int32_t err,maxplayers,gameheight,n,numvouts,vout=1; int64_t inputsum,buyin,CCchange=0; CPubKey pk,mypk,roguepk,burnpk; CTransaction tx,playertx; std::vector playerdata; std::string rawtx; bits256 t; + UniValue result(UniValue::VOBJ); char destaddr[64],coinaddr[64]; uint256 tokenid,gametxid,origplayergame,playertxid,hashBlock; int32_t err,maxplayers,gameheight,n,numvouts,vout=1; int64_t inputsum,buyin,CCchange=0; CPubKey pk,mypk,roguepk,burnpk; CTransaction tx,playertx; std::vector playerdata; std::string rawtx,symbol,pname; bits256 t; if ( txfee == 0 ) txfee = 10000; @@ -710,7 +732,7 @@ UniValue rogue_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) if ( n > 1 ) { playertxid = juint256(jitem(params,1)); - if ( rogue_playerdata(cp,origplayergame,tokenid,pk,playerdata,playertxid) < 0 ) + if ( rogue_playerdata(cp,origplayergame,tokenid,pk,playerdata,symbol,pname,playertxid) < 0 ) return(cclib_error(result,"couldnt extract valid playerdata")); if ( tokenid != zeroid ) vout = 1; @@ -725,9 +747,9 @@ UniValue rogue_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) return(cclib_error(result,"couldnt find playerdata to spend")); else if ( buyin > 0 && AddNormalinputs(mtx,mypk,buyin,64) < buyin ) return(cclib_error(result,"couldnt find enough normal funds for buyin")); - if ( playertxid != zeroid ) + if ( tokenid != zeroid ) { - mtx.vin.push_back(CTxIn(playertxid,0)); // spending cc marker as token is burned + mtx.vin.push_back(CTxIn(tokenid,0)); // spending cc marker as token is burned char unspendableTokenAddr[64]; uint8_t tokenpriv[32]; struct CCcontract_info *cpTokens, tokensC; cpTokens = CCinit(&tokensC, EVAL_TOKENS); CPubKey unspPk = GetUnspendable(cpTokens, tokenpriv); @@ -743,7 +765,6 @@ UniValue rogue_register(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) CScript opretRegister = rogue_registeropret(gametxid, playertxid); if ( playertxid != zeroid ) { - //fprintf(stderr,"gametxid.%s playertxid.%s opR.%d\n",gametxid.GetHex().c_str(),playertxid.GetHex().c_str(),(int32_t)opretRegister.size()); voutPubkeysEmpty.push_back(burnpk); if ( GetTransaction(playertxid,playertx,hashBlock,false) != 0 ) { @@ -775,7 +796,7 @@ UniValue rogue_keystrokes(uint64_t txfee,struct CCcontract_info *cp,cJSON *param // respawn to be prevented by including timestamps int32_t nextheight = komodo_nextheight(); CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(),nextheight); - UniValue result(UniValue::VOBJ); CPubKey roguepk,mypk; uint256 gametxid,playertxid,batontxid; int64_t batonvalue,buyin; std::vector keystrokes,playerdata; int32_t numplayers,regslot,numkeys,batonht,batonvout,n,elapsed,gameheight,maxplayers; CTransaction tx; CTxOut txout; char *keystrokestr,destaddr[64]; std::string rawtx; bits256 t; uint8_t mypriv[32]; + UniValue result(UniValue::VOBJ); CPubKey roguepk,mypk; uint256 gametxid,playertxid,batontxid; int64_t batonvalue,buyin; std::vector keystrokes,playerdata; int32_t numplayers,regslot,numkeys,batonht,batonvout,n,elapsed,gameheight,maxplayers; CTransaction tx; CTxOut txout; char *keystrokestr,destaddr[64]; std::string rawtx,symbol,pname; bits256 t; uint8_t mypriv[32]; if ( txfee == 0 ) txfee = 10000; rogue_univalue(result,"keystrokes",-1,-1); @@ -788,7 +809,7 @@ UniValue rogue_keystrokes(uint64_t txfee,struct CCcontract_info *cp,cJSON *param GetCCaddress1of2(cp,destaddr,roguepk,mypk); if ( rogue_isvalidgame(cp,gameheight,tx,buyin,maxplayers,gametxid) == 0 ) { - if ( rogue_findbaton(cp,playertxid,0,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,tx,maxplayers,destaddr,numplayers) == 0 ) + if ( rogue_findbaton(cp,playertxid,0,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,tx,maxplayers,destaddr,numplayers,symbol,pname) == 0 ) { if ( maxplayers == 1 || nextheight <= batonht+ROGUE_MAXKEYSTROKESGAP ) { @@ -819,7 +840,7 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param // vout0 -> 1% ingame gold // get any playerdata, get all keystrokes, replay game and compare final state CMutableTransaction mtx = CreateNewContextualCMutableTransaction(Params().GetConsensus(), komodo_nextheight()); - UniValue result(UniValue::VOBJ); std::string rawtx; CTransaction gametx; uint64_t seed,mult; int64_t buyin,batonvalue,inputsum,cashout,CCchange=0; int32_t i,err,gameheight,tmp,numplayers,regslot,n,num,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector playerdata,newdata; uint256 batontxid,playertxid,gametxid; CPubKey mypk,roguepk; uint8_t player[10000],mypriv[32],funcid; + UniValue result(UniValue::VOBJ); std::string rawtx,symbol,pname; CTransaction gametx; uint64_t seed,mult; int64_t buyin,batonvalue,inputsum,cashout,CCchange=0; int32_t i,err,gameheight,tmp,numplayers,regslot,n,num,numkeys,maxplayers,batonht,batonvout; char myrogueaddr[64],*keystrokes = 0; std::vector playerdata,newdata,nodata; uint256 batontxid,playertxid,gametxid; CPubKey mypk,roguepk; uint8_t player[10000],mypriv[32],funcid; struct CCcontract_info *cpTokens, tokensC; if ( txfee == 0 ) @@ -850,11 +871,13 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param { if ( maxplayers == 1 ) mult /= 2; - if ( rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,myrogueaddr,numplayers) == 0 ) + if ( rogue_findbaton(cp,playertxid,&keystrokes,numkeys,regslot,playerdata,batontxid,batonvout,batonvalue,batonht,gametxid,gametx,maxplayers,myrogueaddr,numplayers,symbol,pname) == 0 ) { UniValue obj; struct rogue_player P; + if ( pname.size() == 0 ) + pname = Rogue_pname; seed = rogue_gamefields(obj,maxplayers,buyin,gametxid,myrogueaddr); - fprintf(stderr,"found baton %s numkeys.%d seed.%llu playerdata.%d\n",batontxid.ToString().c_str(),numkeys,(long long)seed,(int32_t)playerdata.size()); + fprintf(stderr,"(%s) found baton %s numkeys.%d seed.%llu playerdata.%d\n",pname.c_str(),batontxid.ToString().c_str(),numkeys,(long long)seed,(int32_t)playerdata.size()); memset(&P,0,sizeof(P)); if ( playerdata.size() > 0 ) { @@ -909,11 +932,16 @@ UniValue rogue_finishgame(uint64_t txfee,struct CCcontract_info *cp,cJSON *param Myprivkey(mypriv); CCaddr1of2set(cp,roguepk,mypk,mypriv,myrogueaddr); - CScript opret = rogue_highlanderopret(funcid, gametxid, regslot, mypk, newdata); + CScript opret; if ( newdata.size() == 0 ) + { + opret = rogue_highlanderopret(funcid, gametxid, regslot, mypk, nodata,pname); rawtx = FinalizeCCTx(0,cp,mtx,mypk,txfee,opret); + //fprintf(stderr,"nodata finalizetx.(%s)\n",rawtx.c_str()); + } else { + opret = rogue_highlanderopret(funcid, gametxid, regslot, mypk, newdata,pname); char seedstr[32]; sprintf(seedstr,"%llu",(long long)seed); std::vector vopretNonfungible; @@ -1000,13 +1028,13 @@ UniValue rogue_pending(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) result.push_back(Pair("result","success")); rogue_univalue(result,"pending",-1,-1); result.push_back(Pair("pending",a)); - result.push_back(Pair("numpending",a.size())); + result.push_back(Pair("numpending",(int64_t)a.size())); return(result); } UniValue rogue_players(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) { - UniValue result(UniValue::VOBJ),a(UniValue::VARR); int64_t buyin; uint256 tokenid,gametxid,txid,hashBlock; CTransaction playertx,tx; int32_t maxplayers,vout,numvouts; std::vector playerdata; CPubKey roguepk,mypk,pk; char coinaddr[64]; + UniValue result(UniValue::VOBJ),a(UniValue::VARR); int64_t buyin; uint256 tokenid,gametxid,txid,hashBlock; CTransaction playertx,tx; int32_t maxplayers,vout,numvouts; std::vector playerdata; CPubKey roguepk,mypk,pk; std::string symbol,pname; char coinaddr[64]; std::vector > unspentOutputs; roguepk = GetUnspendable(cp,0); mypk = pubkey2pk(Mypubkey()); @@ -1020,14 +1048,75 @@ UniValue rogue_players(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) //char str[65]; fprintf(stderr,"%s check %s/v%d %.8f\n",coinaddr,uint256_str(str,txid),vout,(double)it->second.satoshis/COIN); if ( it->second.satoshis != 1 || vout > 1 ) continue; - if ( rogue_playerdata(cp,gametxid,tokenid,pk,playerdata,txid) == 0 )//&& pk == mypk ) + if ( rogue_playerdata(cp,gametxid,tokenid,pk,playerdata,symbol,pname,txid) == 0 )//&& pk == mypk ) { - a.push_back(rogue_playerobj(playerdata,txid,tokenid)); - //result.push_back(Pair("playerdata",rogue_playerobj(playerdata))); + a.push_back(txid.GetHex()); + //a.push_back(Pair("playerdata",rogue_playerobj(playerdata))); } } result.push_back(Pair("playerdata",a)); - result.push_back(Pair("numplayerdata",a.size())); + result.push_back(Pair("numplayerdata",(int64_t)a.size())); + return(result); +} + +UniValue rogue_games(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) +{ + UniValue result(UniValue::VOBJ),a(UniValue::VARR),b(UniValue::VARR); uint256 txid,hashBlock,gametxid,tokenid,playertxid; int32_t vout,maxplayers,gameheight,numvouts; CPubKey roguepk,mypk; char coinaddr[64]; CTransaction tx,gametx; int64_t buyin; + std::vector > addressIndex; + //std::vector > unspentOutputs; + roguepk = GetUnspendable(cp,0); + mypk = pubkey2pk(Mypubkey()); + GetCCaddress1of2(cp,coinaddr,roguepk,mypk); + //SetCCunspents(unspentOutputs,coinaddr); + SetCCtxids(addressIndex,coinaddr); + rogue_univalue(result,"games",-1,-1); + for (std::vector >::const_iterator it=addressIndex.begin(); it!=addressIndex.end(); it++) + //for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + vout = (int32_t)it->first.index; + //char str[65]; fprintf(stderr,"%s check %s/v%d %.8f\n",coinaddr,uint256_str(str,txid),vout,(double)it->second.satoshis/COIN); + if ( vout == 0 ) + { + if ( GetTransaction(txid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 1 ) + { + if ( rogue_registeropretdecode(gametxid,tokenid,playertxid,tx.vout[numvouts-1].scriptPubKey) == 'R' ) + { + if ( rogue_isvalidgame(cp,gameheight,gametx,buyin,maxplayers,gametxid) == 0 ) + { + if ( CCgettxout(txid,vout,1) < 0 ) + b.push_back(gametxid.GetHex()); + else a.push_back(gametxid.GetHex()); + } + } + } + } + } + result.push_back(Pair("pastgames",b)); + result.push_back(Pair("games",a)); + result.push_back(Pair("numgames",(int64_t)(a.size()+b.size()))); + return(result); +} + +UniValue rogue_setname(uint64_t txfee,struct CCcontract_info *cp,cJSON *params) +{ + UniValue result(UniValue::VOBJ); int32_t n; char *namestr = 0; + rogue_univalue(result,"setname",-1,-1); + if ( (params= cclib_reparse(&n,params)) != 0 ) + { + if ( n > 0 ) + { + if ( (namestr= jstri(params,0)) != 0 ) + { + result.push_back(Pair("result","success")); + result.push_back(Pair("pname",namestr)); + Rogue_pname = namestr; + return(result); + } + } + } + result.push_back(Pair("result","error")); + result.push_back(Pair("error","couldnt get name")); return(result); } diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index d870e627c..98b5deccc 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -499,6 +499,7 @@ static const CRPCCommand vRPCCommands[] = { "tokens", "tokeninfo", &tokeninfo, true }, { "tokens", "tokenlist", &tokenlist, true }, { "tokens", "tokenorders", &tokenorders, true }, + { "tokens", "mytokenorders", &mytokenorders, true }, { "tokens", "tokenaddress", &tokenaddress, true }, { "tokens", "tokenbalance", &tokenbalance, true }, { "tokens", "tokencreate", &tokencreate, true }, diff --git a/src/rpc/server.h b/src/rpc/server.h index a2aba895b..9cacce8ac 100644 --- a/src/rpc/server.h +++ b/src/rpc/server.h @@ -241,6 +241,7 @@ extern UniValue coinsupply(const UniValue& params, bool fHelp); extern UniValue tokeninfo(const UniValue& params, bool fHelp); extern UniValue tokenlist(const UniValue& params, bool fHelp); extern UniValue tokenorders(const UniValue& params, bool fHelp); +extern UniValue mytokenorders(const UniValue& params, bool fHelp); extern UniValue tokenbalance(const UniValue& params, bool fHelp); extern UniValue assetsaddress(const UniValue& params, bool fHelp); extern UniValue tokenaddress(const UniValue& params, bool fHelp); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c0f9dc297..5564c2000 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -7038,8 +7038,8 @@ UniValue tokenorders(const UniValue& params, bool fHelp) { uint256 tokenid; if ( fHelp || params.size() > 1 ) - throw runtime_error("tokenorders [tokenid]\n"); - if ( ensure_CCrequirements(EVAL_ASSETS) < 0 ) + throw runtime_error("tokenorders tokenid\n"); + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); @@ -7048,9 +7048,29 @@ UniValue tokenorders(const UniValue& params, bool fHelp) if (tokenid == zeroid) throw runtime_error("incorrect tokenid\n"); } - else - memset(&tokenid,0,sizeof(tokenid)); - return(AssetOrders(tokenid)); + else { + // memset(&tokenid, 0, sizeof(tokenid)); + throw runtime_error("no tokenid\n"); + } + return AssetOrders(tokenid, CPubKey(), 0); +} + + +UniValue mytokenorders(const UniValue& params, bool fHelp) +{ + uint256 tokenid; + if (fHelp || params.size() > 2) + throw runtime_error("mytokenorders [evalcode]\n"); + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) + throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); + const CKeyStore& keystore = *pwalletMain; + LOCK2(cs_main, pwalletMain->cs_wallet); + + uint8_t additionalEvalCode = 0; + if (params.size() == 1) + additionalEvalCode = strtol(params[0].get_str().c_str(), NULL, 0); // supports also 0xEE-like values + + return AssetOrders(zeroid, Mypubkey(), additionalEvalCode); } UniValue tokenbalance(const UniValue& params, bool fHelp) @@ -7235,7 +7255,7 @@ UniValue tokenbid(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); int64_t bidamount,numtokens; std::string hex; double price; uint256 tokenid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokenbid numtokens tokenid price\n"); - if ( ensure_CCrequirements(EVAL_ASSETS) < 0 ) + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); @@ -7277,7 +7297,7 @@ UniValue tokencancelbid(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); std::string hex; int32_t i; uint256 tokenid,bidtxid; if ( fHelp || params.size() != 2 ) throw runtime_error("tokencancelbid tokenid bidtxid\n"); - if ( ensure_CCrequirements(EVAL_ASSETS) < 0 ) + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); @@ -7302,7 +7322,7 @@ UniValue tokenfillbid(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); int64_t fillamount; std::string hex; uint256 tokenid,bidtxid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokenfillbid tokenid bidtxid fillamount\n"); - if ( ensure_CCrequirements(EVAL_ASSETS) < 0 ) + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); @@ -7334,7 +7354,7 @@ UniValue tokenask(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); int64_t askamount,numtokens; std::string hex; double price; uint256 tokenid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokenask numtokens tokenid price\n"); - if ( ensure_CCrequirements(EVAL_ASSETS) < 0 ) + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); @@ -7396,7 +7416,7 @@ UniValue tokencancelask(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); std::string hex; int32_t i; uint256 tokenid,asktxid; if ( fHelp || params.size() != 2 ) throw runtime_error("tokencancelask tokenid asktxid\n"); - if ( ensure_CCrequirements(EVAL_ASSETS) < 0 ) + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); @@ -7421,7 +7441,7 @@ UniValue tokenfillask(const UniValue& params, bool fHelp) UniValue result(UniValue::VOBJ); int64_t fillunits; std::string hex; uint256 tokenid,asktxid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokenfillask tokenid asktxid fillunits\n"); - if ( ensure_CCrequirements(EVAL_ASSETS) < 0 ) + if (ensure_CCrequirements(EVAL_ASSETS) < 0 || ensure_CCrequirements(EVAL_TOKENS) < 0) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet);