소개
지금이 프로젝트를 수 주일 동안 빌드하고 여러 가지 해결책을 시도해 보았습니다. 주위에 머리. 이 프로젝트를 조금 설명해 드리겠습니다. 플레이어가 텔넷이나 클라이언트를 통해 로그인 할 수있는 텍스트 기반 서버입니다. 기본적으로 머드 (MUD)와 같습니다. 그런 다음 '객체'를 만들고 상호 작용하여 '동사'와 '속성'을 부여 할 수 있습니다.네트워크 액세스 가능, 다중 사용자, 프로그래밍 가능한 대화 형 환경 구축에 대한 몇 가지 질문
서버는 기본적으로 '개체'의 데이터베이스이며 각 개체는 ID, 이름, 위치 (다른 개체), 콘텐츠 (개체) 목록 및 기타 플래그를 가지고 있습니다. 객체는 '동사'와 '속성'을 가질 수 있습니다. 속성은 저장된 데이터 (문자열, int, 부동, w/e)입니다. 동사는 메소드/함수입니다. 객체는 "컨테이너에 무엇인가 넣기"와 같은 명령을 사용하여 상호 작용합니다. 이전 버전의 서버가 이미 존재합니다. LambdaMOO입니다. 아주 오래 동안 업데이트되지 않았으므로 다시 작성하려고합니다.
당신은 객체, 동사와 특성에 작동 방법에 대해 더 깊이 읽을 수 있습니다 :
날 내가 원하는 것을 설명하자 http://bit.ly/17XIqjY
예를. 우리가 물건을 가지고 있다고 상상해보십시오. Object # 256, "버튼"이라고합니다. 부모로부터 상속 된 모든 기본 속성 (예 : '설명')과 함께 '개수'속성이 있습니다. 그것에는 "푸시 (push)"라는 동사가 하나 있습니다. 이 동사는이 코드가 포함되어 서버의 플레이어 유형 '푸시 버튼'는 '푸시'동사가 실행
this.count += 1;
this.description = "This button has been pushed " + this.count + " times.";
player.tell("You press the button and feel a chill run down your spine.");
출력
You press the button and feel a chill run down your spine.
하면 다음 look
만약 버튼에서을 당신을 업데이트 된 설명이 표시됩니다.
위의 스크립트에서 player
은 동사를 실행하는 플레이어의 개체를 나타냅니다. tell
은 플레이어 개체의 또 다른 동사입니다. 그러나 tell
동사에는 다른 동사에서 실행 가능하다는 플래그가 있습니다.
어떤 언어입니까?
내 주요 질문은 '동사'에 사용할 수있는 언어는 무엇입니까? 나는 node.js와 'VM'라이브러리를 사용해 보았습니다. C#을 사용하여 구문 분석을 시도했습니다. C#을 사용하여 JavaScript 구문 분석을 시도했습니다. 계속 문제가되는 것은 내가 동사와 속성의 사용 권한을 제어 할 수있는 방법이 없다는 것입니다. JavaScript에서 리터럴 함수로 변환하면 어떤 객체가 실행되고 있고 어떤 권한이 있어야하는지 확인할 수 없습니다. 사용자가 다른 사용자 객체에서 함수를 호출하면 권한이 올바르지 않으면 해당 호출을 가로 채고 중지하는 방법이 없습니다. 모든 언어가 동사 코드에 사용되는 것처럼 "sandboxed"할 필요가 없다는 것에 전적으로 의아해하지 않습니다. 속성은 동사와 마찬가지로 사용자가 설정 한 경우에만 읽기/쓰기 가능해야합니다. PHP (__get, __set, __call 같은) 과부하가있는 언어를 사용할 수 있다고 상상합니다.
는 나는 또한 동사에 이러한 변수를 삽입 할 수 있어야:
player (object) the player who typed the command
this (object) the object on which this verb was found
caller (object) this will be the same as ‘player’, unless another
verb calls the command in which case it is the object
containing that verb.
verb (string) the first word of the command
argstr (string) everything after the first word of the command
args (list of strings) a list of the words in ‘argstr’
dobjstr (string) the direct object string found during parsing
dobj (object) the direct object value found during matching
prepstr (string) the prepositional phrase found during parsing
iobjstr (string) the indirect object string
iobj (object) the indirect object value
(동사가 다른 동사에서 호출되지 않는 한 대부분 입력 한 명령에서 결정) 또한 할 수 있어야합니다 다른 개체의 개체에 액세스하십시오 (권한이 작동하는 한).
// Object #128. Verb: multiply Prep: this none this Perms: +r +x
return (args[0] * args[1]);
// Object #256. Verb: square Prep: this none this Perms: +r +x
return #128:multiply(args[0], args[0]);
// Object #512. Verb: touch Prep: any any this Perms: +r
// Has a property (int) 'size' on it.
this.size = #256:square(this.size);
this.description = "It's a large button, it spans " + this.size + " metres.";
player:tell("You touch the button, it gets bigger.");
그러면 사용자는 push button
일 수 있으며 버튼 개체의 크기 속성은 제곱됩니다.
읽기 추천
는내가보기 엔 당신이 시스템이 작동하는 방법에 대한보다 깊이있는 아이디어를 http://bit.ly/17XIqjY에서 문서를 읽을 것을 권장합니다.
- https://en.wikipedia.org/wiki/LambdaMOO
- https://en.wikipedia.org/wiki/MOO
- http://www.hayseed.net/MOO/manuals/ProgrammersManual_toc.html
- http://www.moo.mud.org/
이 질문에 대한 자세한 내용을 고맙게 생각하지만, 질문을보다 간결하게 이해하기 위해 약간 편집 해 두는 것이 좋습니다. 또한 참고로, 활발한 MOO 개발자 커뮤니티가 있습니다. https://groups.google.com/forum/#!forum/moo-talk – georgek
MOO 토크 포럼에 대해 알고 있습니다 만, 포럼은 원래 내용을 중심으로 진행됩니다. MOO 서버 및 코어 이것은 이전의 원칙에 기반한 완전히 새로운 프로젝트입니다. 나는 옛 작품이 어떻게 효과가 있었는지를 잘 알고 있으며, 나는이 작품에 관해서 그들이 많이 도움이 될 것이라고 생각하지 않는다. 나는 그것을 어떻게해서든지 시험 할 것이다. 더 모호하지 않고 질문을 편집 할 수 있는지 잘 모르겠다. 대답을하면 대답 전체 개념을 고려하지 않을 것이다. – R4wizard
GitHub에서 LambdaMOO를 (를) 검색합니다.당신이 체크 아웃 할 수있는 몇 가지 현대적인 포트가 있습니다. – Brendan