COMMAND.CPP
上传用户:abcdshs
上传日期:2007-01-07
资源大小:1858k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. // (C) Copyright 1996 by Anthony J. Carin.  All Rights Reserved.
  2. #include "stdafx.h"
  3. #include "command.h"
  4. #include "levels.h"
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <mmsystem.h>
  8. static char *inststr[] =
  9. {
  10. "ENDSESSION",
  11. "INSERTFILE",
  12. "THEYDO",
  13. "TILTBODYRIGHT",
  14. "TILTBODYLEFT",
  15. "TILTBODYFWD",
  16. "TILTBODYBCK",
  17. "TURNHEADLEFT",
  18. "TURNHEADRIGHT",
  19. "TURNHEADUP",
  20. "TURNHEADDOWN",
  21. "RLEGBENDKNEE",
  22. "LLEGBENDKNEE",
  23. "RLEGRAISEFWD",
  24. "LLEGRAISEFWD",
  25. "RLEGRAISEBCK",
  26. "LLEGRAISEBCK",
  27. "RLEGRAISESIDE",
  28. "LLEGRAISESIDE",
  29. "RARMBENDELBOW",
  30. "LARMBENDELBOW",
  31. "RARMRAISEFWD",
  32. "LARMRAISEFWD",
  33. "RARMRAISEBCK",
  34. "LARMRAISEBCK",
  35. "RARMRAISESIDE",
  36. "LARMRAISESIDE",
  37. "TURNRIGHT",
  38. "TURNLEFT",
  39. "MOVEUPWARD",
  40. "MOVEFOWARD",
  41. "MOVEBACKWARD",
  42. "PLAYSOUND",
  43. "PLAYGENERIC",
  44. "BEGINPROTECT",
  45. "ENDPROTECT",
  46. "STRIKETOP",
  47. "STRIKEMED",
  48. "STRIKEBOT",
  49. "TILTRIGHTWEAPON",
  50. "TILTLEFTWEAPON",
  51. "CLEAR",
  52. "HURTME",
  53. "RTHROW",
  54. "LTHROW",
  55. "PICKUP",
  56. "NOMORE"
  57. };
  58. static insttype getinst(char *str);
  59. static char     stringcommand(insttype inst);
  60. instruction::instruction()
  61. {
  62.     m_inst   = NOMORE;
  63.     m_value  = 0.0f;
  64.     m_string = NULL;
  65.     Next     = NULL;
  66. }
  67. instruction::instruction(instruction& i)
  68. {
  69.     m_inst   = i.m_inst;
  70.     m_value  = i.m_value;
  71.     m_string = NULL;
  72.     setstring(i.string());
  73.     Next     = NULL;
  74. }
  75. void instruction::operator=(instruction& i)
  76. {
  77.     m_inst   = i.m_inst;
  78.     m_value  = i.m_value;
  79.     setstring(i.string());
  80. }
  81. void instruction::setstring(char *str)
  82. {
  83.    if (str == 0 || *str == 0)
  84.    {
  85.        if (m_string)
  86.             delete m_string;
  87.        m_string = NULL;
  88.        return;
  89.    }
  90.    if (m_string)
  91.        delete m_string;
  92.    m_string = new char[strlen(str) + 1];
  93.    strcpy(m_string, str);
  94. }
  95. void instlist::purge()
  96. {
  97.    while (First)
  98.    {
  99.       Current = First;
  100.       First = First->Next;
  101.       delete Current;
  102.    }
  103.    First = Last = Current = 0;
  104.    m_protected = FALSE;
  105. }
  106. void instlist::remove(insttype v)
  107. {
  108.    instruction itmp; 
  109.    instruction *tmp = First, *hold;
  110.    char removed = FALSE;
  111.    hold = 0;
  112.    while (tmp)
  113.    {
  114.       itmp = *tmp;
  115.       if (itmp() == ENDPROTECT)
  116.       {
  117.           m_protected = FALSE;
  118.           hold = tmp;
  119.           tmp = tmp->Next;
  120.       }
  121.       else if (itmp() == BEGINPROTECT)
  122.       {
  123.           m_protected = TRUE;
  124.           while (tmp)
  125.           {
  126.               itmp = *tmp;
  127.               if (itmp() == ENDPROTECT)
  128.                   break;
  129.               tmp = tmp->Next;
  130.           }
  131.           if (tmp == NULL)
  132.               break;
  133.       }
  134.       else if ((itmp() == v || v == NOMORE) &&
  135.                m_protected == FALSE)
  136.       {
  137.           removed = TRUE;
  138.           if (hold == 0)
  139.           {
  140.               First = tmp->Next;
  141.               if (tmp == Current)
  142.                   Current = tmp->Next;
  143.               if (tmp == Last)
  144.                   Last = 0;
  145.               delete tmp;
  146.               tmp = First;
  147.           }
  148.           else
  149.           {
  150.               hold->Next = tmp->Next;
  151.               if (tmp == Current)
  152.                   Current = tmp->Next;
  153.               if (tmp == Last)
  154.                   Last = hold;
  155.               delete tmp;
  156.               tmp = hold->Next;
  157.           }
  158.       }
  159.       else
  160.       {
  161.           hold = tmp;
  162.           tmp = tmp->Next;
  163.       }
  164.    }
  165.    if (hold == 0 && removed)
  166.        First = Current = Last = 0;
  167. }
  168. void instlist::add(instruction& i)
  169. {
  170.    instruction *tmp;
  171.    tmp = new instruction(i);
  172.    if (First == 0)
  173.    {
  174.       First = Last = Current = tmp;
  175.    }
  176.    else
  177.    {
  178.       Last->Next = tmp;
  179.       Last = tmp;
  180.    }
  181. }
  182. instruction& instlist::next()
  183. {
  184.    static instruction ret;
  185.    if (Current == 0)
  186.    {
  187.       ret = NOMORE;
  188.    }
  189.    else
  190.    {
  191.       ret = *Current;
  192.       if (m_purgeold && Current == First)
  193.       {
  194.          Current = Current->Next;
  195.          delete First;
  196.          First = Current;
  197.       }
  198.       else
  199.          Current = Current->Next;
  200.    }
  201.    return ret;
  202. }
  203. command::command(LPCTSTR filename)
  204. {
  205.     FILE *fp;
  206.     char comstr[40];
  207.     float comval;
  208.     instruction inst;
  209.     m_instlist = new instlist();
  210.     fp = fopen(getpath((CString)filename), "r");
  211.     if (fp <= 0)
  212.     {
  213.         itoa(errno, comstr, 10);
  214.         return;
  215.     }
  216.     while (!feof(fp))
  217.     {
  218.         fscanf(fp, "%s", comstr);
  219.         inst = getinst(comstr);
  220.         if (inst() == NOMORE)
  221.            break;
  222.         if (inst() == NOTEXIST)
  223.         {
  224.            fscanf(fp, "%s", comstr);
  225.            continue;
  226.         }
  227.         if (inst() == INSERTFILE)
  228.         {
  229.            fscanf(fp, "%s", comstr);
  230.            strcat(comstr, ".cmd");
  231.            command other(comstr);
  232.            append(other);
  233.            continue;
  234.         }
  235.         if (stringcommand(inst()))
  236.         {
  237.            fscanf(fp, "%s", comstr);
  238.            inst.setstring(comstr);
  239.         }
  240.         else
  241.         {
  242.            fscanf(fp, "%s", comstr);
  243.            comval = (float) atof(comstr);
  244.            inst.setvalue(comval/100.0f);
  245.         }
  246.         m_instlist->add(inst);
  247.     }
  248.     fclose(fp);
  249. }
  250. static insttype getinst(char *str)
  251. {
  252.     for (int i = ENDSESSION; i <= NOMORE; i++)
  253.     {
  254.         if (strcmp(str, inststr[i]) == 0)
  255.             break;
  256.     }
  257.     return (insttype) i;
  258. }
  259. static char stringcommand(insttype inst)
  260. {
  261.     if (inst == PLAYSOUND ||
  262.         inst == THEYDO)
  263.         return TRUE;
  264.     return FALSE;
  265. }
  266. void command::append(command& other)
  267. {
  268.     instruction tmp;
  269.     tmp = other.next();
  270.     while (tmp() != NOMORE)
  271.     {
  272.        m_instlist->add(tmp);
  273.        tmp = other.next();
  274.     }
  275. }
  276. void command::AddToValue(insttype instruct, short bonus)
  277. {
  278.     instruction tmp;
  279.     m_instlist->restart();
  280.     tmp = m_instlist->next();
  281.     while (tmp() != NOMORE)
  282.     {
  283.        if (tmp() == instruct)
  284.            tmp.setvalue(tmp.value()+bonus);
  285.        tmp = m_instlist->next();
  286.     }
  287.     m_instlist->restart();
  288. }