ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/Daodan/MSVC/Daodan_BSL.c
(Generate patch)

Comparing Daodan/MSVC/Daodan_BSL.c (file contents):
Revision 568 by gumby, Wed Jun 30 04:25:00 2010 UTC vs.
Revision 569 by gumby, Wed Jul 14 07:35:40 2010 UTC

# Line 552 | Line 552 | uint16_t ONICALL bsl_waitforkey(sl_calli
552   //              Character* Chr = ONgGameState->CharacterStorage;
553   //      ActiveCharacter* Active = (ActiveCharacter*)ONrGetActiveCharacter(&Chr[index]);
554   //      if ((int)Active == 0) return 1;
555 +
556          int i = 2;
557          int j = 0;
558          int Input1 = 0;
559          int Input2 = 0;
560 <        for(i = 0; i < numargs; i++) {
560 > /*
561 >        numargs = 0;
562 >        for(i = 0; args[i].type <= sl_void; i++)
563 >        {
564 >                //DDrConsole_PrintF("%i", args[i].type );
565 >                numargs++;
566 >
567 >        }
568 >        if(numargs < 1 || args[0].value == 0)  return;
569 >        //for(i = 0; i < numargs; i++) {
570 >        */
571 >        i = 0;
572                  for(j = 0; j < 32; j++) {
573                          //DDrConsole_PrintF("Testing %s against %s 0x%x", args[i].value_str32, Actions1[j].Name, Actions1[j].Bit);
574                          if(!strcmp(args[i].value_str32, Actions1[j].Name)) {
# Line 569 | Line 581 | uint16_t ONICALL bsl_waitforkey(sl_calli
581                          if(!strcmp(args[i].value_str32, Actions2[j].Name)) Input2 = Input2 | Actions2[j].Bit;
582          
583                  }
584 <                }
585 <        //DDrConsole_PrintF("Waiting...");
584 >        //      }
585 >        DDrConsole_PrintF("Waiting...");
586          if (
587                  (( ONgGameState->Input.Current.Actions1 & Input1) == Input1)  &&
588                  (( ONgGameState->Input.Current.Actions2 & Input2) == Input2)
589 <        ){
589 >        )
590 >        {
591 >        DDrConsole_PrintF("Found key!");
592          }
593          else {
594          //else (int)*ret = 1;
595          *dontuse2 = 1;
596          *dontuse1 = 1;
597          }
598 < /*
585 <        __asm__(
586 <                "movl 0x10(%esp), %edx\n\t"
587 <                "movl    $1,(%eax)\n\t"
588 <                );
589 <        //ret->type = sl_void
590 < */      return 0;
598 >        return 0;
599   }
600  
601 < /*
601 >
602   uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
603   {
604 <        if (numargs < 2)
604 >        char output[1024];
605 >        char buffer[1024];
606 >        int i;
607 >        char* placeinoutput = output;
608 >        char* placeininput = args[0].value_str32;
609 >        int formatnum = 0;
610 >        //fix the broken bsl numargs...
611 >        numargs = 0;
612 >        
613 >        for(i = 0; args[i].type < sl_void; i++)
614 >        {
615 >                numargs++;
616 >        }
617 >        
618 >        
619 >        if (numargs < 1)
620                  return 1;
621          
622 <        char output[255];
623 <        int i;
622 >        while(1)
623 >        {
624 >                int size;
625 >                //s is the pointer to the args
626 >                char* s = strchr(placeininput , '%');
627 >                //we didnt find a %, break!
628 >                if(!s)
629 >                {
630 >                        strcpy(placeinoutput, placeininput);
631 >                        break;
632 >                }
633 >                size = (int)s - (int)placeininput ;
634 >                //we found one, so copy the portion of string
635 >                
636 >
637 >                
638 >                memcpy( placeinoutput,placeininput, size);
639 >                placeininput += size;
640 >                placeinoutput += size;
641 >
642 >                memset( placeinoutput, '%', (int)pow(2, formatnum));
643 >                placeinoutput += (int)pow(2, formatnum);
644 >
645 >
646 >                placeininput += 1;
647 >                *placeinoutput = 0;
648 >                formatnum++;
649 >                
650 >        }
651 >        //strcpy( output, args[0].value_str32 );
652 >
653          for(i = 1; i < numargs; i++)    {
654 <                sprintf(output, args[0].value_str32, args[i].value_str32);
654 >                //sprintf(output, output, args[i].value_str32);
655 >                memcpy(buffer, output, 1024);
656 >                if(args[i].value == 0) break;
657 >                switch(args[i].type)
658 >                {
659 >                case sl_bool:
660 >                case sl_int32:
661 >                        sprintf(output, buffer, args[i].value_int32);
662 >                        break;
663 >                case sl_float:
664 >                        //crashes oni, why?
665 >                //      sprintf(output, output, args[i].value_float);
666 >                        break;
667 >                case sl_str32:
668 >                        sprintf(output, buffer, args[i].value_str32);
669 >                        break;
670 >                case sl_void:
671 >                default:
672 >                        break;
673 >                }      
674          }
675 <        
675 >        //output[32] = 0;
676          ret->value_str32 = output;
677          ret->type = sl_str32;
678          return 0;
679   }
680 < */
680 >
681 > //Sorry rossy, I broke this. FFI isnt in windows
682   /*
683   uint16_t ONICALL bsl_sprintf(sl_callinfo* callinfo, uint32_t numargs, sl_arg args[], int* dontuse1, int* dontuse2, sl_arg* ret)
684   {
685 +        
686 +        
687 +                int ffi_ret;
688 +        char* str = NULL;
689 +        int size = 0;
690 +        
691 +        ffi_cif cif;
692 +        ffi_type* ffi_args[256];
693 +        void* values[256];
694 +        int i;
695 +                numargs = 0;
696 +        for(i = 0; args[i].type <= sl_void; i++)
697 +        {
698 +                //DDrConsole_PrintF("%i", args[i].type );
699 +                numargs++;
700 +
701 +        }
702 +
703          if (numargs < 1 || args[0].type != sl_str32)
704          {
705                  DDrConsole_PrintF("Func \"%s\", File \"%s\", Line %d: semantic error, \"%s\": parameter list does not match: format:string arg1 arg2 ...", callinfo->name, callinfo->calllocation, callinfo->linenumber, callinfo->name);
# Line 619 | Line 709 | uint16_t ONICALL bsl_sprintf(sl_callinfo
709          if (!args[0].value_str32)
710                  args[0].value_str32 = "";
711          
622        int ffi_ret;
623        char* str = NULL;
624        int size = 0;
712          
626        ffi_cif cif;
627        ffi_type* ffi_args[256];
628        void* values[256];
713          
714          ffi_args[0] = &ffi_type_pointer;
715          values[0] = &str;
716          ffi_args[1] = &ffi_type_uint32;
717          values[1] = &size;
718          
719 <        int i;
719 >
720          for(i = 2; i < numargs + 2; i ++)
721          {
722                  if (args[i - 2].type == sl_float)
# Line 653 | Line 737 | uint16_t ONICALL bsl_sprintf(sl_callinfo
737          
738          if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, i, &ffi_type_sint32, ffi_args) != FFI_OK)
739                  return 1;
740 <        ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
740 >        ffi_call(&cif, (void*)_snprintf, (void*)&ffi_ret, values);
741          str = malloc(ffi_ret + 1);
742          size = ffi_ret + 1;
743 <        ffi_call(&cif, (void*)snprintf, (void*)&ffi_ret, values);
743 >        ffi_call(&cif, (void*)_snprintf, (void*)&ffi_ret, values);
744          ret->value_str32 = str;
745          ret->type = sl_str32;
746          return 0;
# Line 776 | Line 860 | uint16_t ONICALL new_text(sl_callinfo* c
860   {
861          void* TSFFTahoma;
862          int returnval;
779        
863          TMrInstance_GetDataPtr( 'TSFF', "Tahoma", &TSFFTahoma);
864          returnval = TSrContext_New( TSFFTahoma, 7, 1, 1,  0, &TSrTest);
865          return 0;
# Line 784 | Line 867 | uint16_t ONICALL new_text(sl_callinfo* c
867  
868   void SLrDaodan_Initalize()
869   {
787        //Calculating the value of the needed offset is much more reliable when the compiler does it for you.
788
789        //TODO: fix moonshadow.
790        Character * Chr = 0;
791        
792        int NoPath = (int)&(Chr[0].RegenHax) & 0x000000FF;
793
794        
795
796        const char regen_patch[] =
797                {0x90, 0x90, 0x90, 0x90, 0x90,  // mov     al, _WPgRegenerationCheat
798                0x90, 0x90,                                             // test    al, al
799                0x90, 0x90,                                             // jz      short loc_51BB98
800                0x8B, 0x86, (char)NoPath, 0x01};        
801        DDrPatch_Const(OniExe + 0x0011BB64, regen_patch);
802
870          SLrConfig();
871  
872          SLrScript_Command_Register_Void("debug_daodan","Adds text to screen", "", new_text);
# Line 823 | Line 890 | void SLrDaodan_Initalize()
890          SLrScript_Command_Register_ReturnType("d_isheld","Checks if player is holding a key", "[ai_name:string | script_id:int] [keys:string]", sl_int32, bsl_isheld);
891          SLrScript_Command_Register_ReturnType("d_location","Returns the X, Y or Z coord of a character", "ai_name:string | script_id:int xyz:string [newlocation:float]", sl_float, bsl_location);
892          SLrScript_Command_Register_ReturnType("d_distance","Returns the distance between two characters", "ai_name:string | script_id:int ai_name:string | script_id:int", sl_float, bsl_distance);
893 <        SLrScript_Command_Register_Void("d_waitforkey","Waits for a keypress from the player", "keys", bsl_waitforkey);
893 >        SLrScript_Command_Register_Void("d_waitforkey","Waits for a keypress from the player", "key:string", bsl_waitforkey);
894  
895          //broken, only works for one damage type.
896          //SLrDaodan_Register_ReturnType("d_getattacker","Gets the last person to hurt a character", "[ai_name:string | script_id:int]", sl_int32, bsl_getattacker);
# Line 831 | Line 898 | void SLrDaodan_Initalize()
898          //used for debugging.
899   //      SLrDaodan_Register_ReturnType("d_active","Returns a hex offset. ;)", "[ai_name:string | script_id:int]", sl_int32, bsl_getactiveoffset);
900  
901 <        //SLrDaodan_Register_ReturnType("sprintf", "C-style sprintf.", "format:string arg1 arg2 ...", sl_str32, bsl_sprintf);
835 <        
901 >        SLrScript_Command_Register_Void("sprintf", "C-style sprintf.", "", bsl_sprintf);
902          SLrScript_Command_Register_ReturnType("st", "prints to console in color", "text:string color1:int color2:int", sl_void, bsl_dprintcolored);
903          
904          //Flatline

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)